Pembaruan:Nanti, jawaban yang lebih detail:
Ini akan bekerja dengan lancar:
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;
Loop mengambil nomor berikutnya dari urutan yang diberikan sampai ditemukan yang belum ada di tabel. Bahkan harus aman untuk penggunaan bersamaan , karena kita masih mengandalkan urutan.
Gunakan fungsi ini di kolom default dari kolom serial (mengganti default untuk kolom serial nextval('t1_id_seq'::regclass)
:
ALTER TABLE db.t1 ALTER COLUMN id
SET DEFAULT f_next_free('t1_id_seq'::regclass);
Ini berkinerja baik dengan beberapa pulau dan banyak celah (yang tampaknya menjadi kasus menurut contoh). Untuk menegakkan keunikan, tambahkan batasan unik (atau kunci utama) pada kolom.