Актуализация:По-късно, по-подробен отговор:
Това трябва да работи гладко:
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;
Цикълът извлича следващото число от дадената последователност, докато се намери такова, което все още не е в таблицата. Дори би трябвало да е безопасно за едновременна употреба , тъй като все още разчитаме на последователност.
Използвайте тази функция в колоната по подразбиране на серийната колона (заменяйки по подразбиране за серийните колони nextval('t1_id_seq'::regclass)
:
ALTER TABLE db.t1 ALTER COLUMN id
SET DEFAULT f_next_free('t1_id_seq'::regclass);
Това се представя добре с малко острови и много пропуски (което изглежда е така според примера). За налагане уникалност, добавете уникално ограничение (или първичен ключ) в колоната.