更新:後で、より詳細な回答:
これはスムーズに機能するはずです:
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);
これは、島が少なく、ギャップが多い場合にうまく機能します(例によるとそうです)。 施行する 一意性については、一意の制約を追加します 列の(または主キー)。