Cập nhật:Sau đó, câu trả lời chi tiết hơn:
Điều này sẽ hoạt động trơn tru:
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;
Vòng lặp đang tìm nạp số tiếp theo từ chuỗi đã cho cho đến khi tìm thấy một số chưa có trong bảng. Thậm chí phải an toàn khi sử dụng đồng thời , vì chúng tôi vẫn dựa trên một trình tự.
Sử dụng hàm này trong cột mặc định của cột nối tiếp (thay thế mặc định cho cột nối tiếp nextval('t1_id_seq'::regclass)
:
ALTER TABLE db.t1 ALTER COLUMN id
SET DEFAULT f_next_free('t1_id_seq'::regclass);
Điều này hoạt động tốt với ít đảo và nhiều khoảng trống (có vẻ là trường hợp theo ví dụ). Để thực thi tính duy nhất, thêm ràng buộc duy nhất (hoặc khóa chính) trên cột.