Opdatering:Senere, mere detaljeret svar:
Dette burde fungere problemfrit:
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;
Løkken henter det næste tal fra den givne sekvens, indtil der findes et, som endnu ikke er i tabellen. Bør endda være sikker til samtidig brug , da vi stadig er afhængige af en sekvens.
Brug denne funktion i kolonnestandarden for den serielle kolonne (erstatter standarden for de serielle kolonner nextval('t1_id_seq'::regclass)
:
ALTER TABLE db.t1 ALTER COLUMN id
SET DEFAULT f_next_free('t1_id_seq'::regclass);
Dette fungerer godt med få øer og mange huller (hvilket ser ud til at være tilfældet ifølge eksemplet). At håndhæve unikhed, tilføj en unik begrænsning (eller primær nøgle) på kolonnen.