Uppdatering:Senare, mer detaljerat svar:
Detta bör fungera smidigt:
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;
Slingan hämtar nästa nummer från den givna sekvensen tills en hittas som ännu inte finns i tabellen. Bör till och med vara säkert för samtidig användning , eftersom vi fortfarande litar på en sekvens.
Använd den här funktionen i kolumnstandarden för seriekolumnen (ersätter standardinställningen för seriekolumnerna nextval('t1_id_seq'::regclass)
:
ALTER TABLE db.t1 ALTER COLUMN id
SET DEFAULT f_next_free('t1_id_seq'::regclass);
Detta fungerar bra med få öar och många luckor (vilket verkar vara fallet enligt exemplet). Att upprätthålla unikhet, lägg till en unik begränsning (eller primärnyckel) i kolumnen.