sql >> Databáze >  >> RDS >> PostgreSQL

Automatické zvýšení, ale vynechte existující hodnoty ve sloupci

Aktualizace:Později, podrobnější odpověď:

To by mělo fungovat hladce:

CREATE OR REPLACE FUNCTION f_next_free(_seq regclass)
  RETURNS integer AS
$func$
BEGIN
   LOOP
      PERFORM nextval(_seq);
      EXIT WHEN NOT EXISTS (SELECT 1 FROM db.t1 WHERE id = lastval());
   END LOOP; 

   RETURN lastval();
END
$func$  LANGUAGE plpgsql VOLATILE;

Smyčka načítá další číslo z dané sekvence, dokud není nalezeno číslo, které ještě není v tabulce. Mělo by být dokonce bezpečné pro souběžné použití , protože stále spoléháme na sekvenci.

Použijte tuto funkci ve výchozím nastavení sloupce sériového sloupce (nahrazení výchozího nastavení pro sériové sloupce nextval('t1_id_seq'::regclass) :

ALTER TABLE db.t1 ALTER COLUMN id
SET DEFAULT f_next_free('t1_id_seq'::regclass);

Příručka k lastval() .

To funguje dobře s několika ostrovy a mnoha mezerami (což se zdá být případem podle příkladu). Chcete-li vynutit jedinečnost, přidejte jedinečné omezení (nebo primární klíč) ve sloupci.



  1. Databázové selhání ve zdrojích dat Jboss

  2. Zápis IDEF1X

  3. Příklady MONTH() v SQL Server (T-SQL)

  4. Poddotaz Oracle nevidí proměnnou z vnějšího bloku o 2 úrovně výše