Aktualizacja:później, bardziej szczegółowa odpowiedź:
To powinno działać bezproblemowo:
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;
Pętla pobiera następną liczbę z podanej sekwencji, dopóki nie zostanie znaleziona taka, której nie ma jeszcze w tabeli. Powinien być nawet bezpieczny do równoczesnego użytku , ponieważ nadal polegamy na sekwencji.
Użyj tej funkcji w domyślnej kolumnie kolumny szeregowej (zastępując wartość domyślną dla kolumn szeregowych nextval('t1_id_seq'::regclass)
:
ALTER TABLE db.t1 ALTER COLUMN id
SET DEFAULT f_next_free('t1_id_seq'::regclass);
Podręcznik dotyczący lastval() .
Działa to dobrze z kilkoma wyspami i wieloma lukami (co wydaje się, że tak jest na przykładzie). Aby wymusić unikatowość, dodaj unikalne ograniczenie (lub klucz główny) w kolumnie.