Đó là một hạn chế đã biết:các chuỗi được tăng lên trong quá trình gọi nextval ()
, là giá trị mặc định của trường. Khi bạn cung cấp dữ liệu tại INSERT
đối với trường đó, biểu thức của giá trị mặc định không đánh giá, đó là lý do tại sao giá trị của trình tự không được chạm vào.
Cách giải quyết là thiết lập trình kích hoạt trước / sau INSERT
để sửa chữa thủ công giá trị của trình tự bằng setval ()
. Nhưng theo cách này, bạn nên cần thiết lập trình kích hoạt vào UPDATE
trên trường đó, để sửa giá trị của trình tự, khi bạn chỉ cần cập nhật một số id hiện có lên một id cao hơn.
Một giải pháp khác là bạn viết một hàm được lưu trữ, hàm này có thể tạo ra một giá trị có sẵn cho trường đó và đặt giá trị mặc định cho trường của bạn thành giá trị trả về của hàm đó. Vài nét, như:
LOOP
result = nextval('my_id_seq');
EXIT WHEN NOT EXISTS (SELECT * FROM my_table WHERE my_id = result);
END LOOP;
RETURN result;
Nhưng được cảnh báo:chức năng mặc định cho các chuỗi là an toàn cho các lần chèn đồng thời (trạng thái hiện tại của chuỗi là toàn cầu - độc lập với giao dịch). Nếu bạn cung cấp các giá trị rõ ràng cho các trường đó, điều đó sẽ không xảy ra.