Update:Later, meer gedetailleerd antwoord:
Dit zou soepel moeten werken:
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;
De lus haalt het volgende nummer uit de gegeven reeks op totdat er een wordt gevonden die nog niet in de tabel staat. Zou zelfs veilig moeten zijn voor gelijktijdig gebruik , omdat we nog steeds op een reeks vertrouwen.
Gebruik deze functie in de kolom standaard van de seriële kolom (ter vervanging van de standaard voor de seriële kolommen nextval('t1_id_seq'::regclass)
:
ALTER TABLE db.t1 ALTER COLUMN id
SET DEFAULT f_next_free('t1_id_seq'::regclass);
De handleiding over lastval() .
Dit presteert goed met weinig eilanden en veel hiaten (wat volgens het voorbeeld het geval lijkt te zijn). Om af te dwingen uniciteit, voeg een unieke beperking