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);
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.