Tôi không biết bất kỳ cách an toàn và hiệu quả nào để làm những gì bạn muốn. Bạn thực sự nên chọn xem bạn muốn tự mình xác định các khóa hay sử dụng các khóa đã tạo và tuân theo chiến lược này hay chiến lược khác.
Nếu bạn không ngại về tính đồng thời khủng khiếp, bạn có thể LOCK TABLE thetable
, làm công việc của bạn, setval
chuỗi mã định danh của bảng thành giá trị miễn phí tiếp theo sau giá trị bạn đã chèn và commit
để mở khóa. Tuy nhiên, điều đó vẫn sẽ gây ra sự cố với các ứng dụng gọi nextval
một cách rõ ràng (giống như nhiều ORM) thay vì để cơ sở dữ liệu xác định giá trị bằng cách bỏ qua nó khỏi ?INSERT
danh sách cột hoặc đặt tên rõ ràng là DEFAULT
.
Nếu không, bạn có thể yêu cầu mã của mình (hoặc một hàm trợ giúp PL / PgSQL) thực hiện việc chèn trong một vòng lặp thử lại để tăng khóa và thử lại khi nó gặp lỗi toàn vẹn. Chiến lược này sẽ không hoạt động nếu bạn cần thực hiện nhiều hơn chỉ một lần chèn cho mỗi giao dịch. Hơn nữa trong SERIALIZABLE
Chế độ cách ly Tôi không nghĩ bạn có thể làm điều đó với PL / PgSQL, bạn phải sử dụng vòng lặp thử lại phía máy khách để xử lý các lỗi tuần tự hóa.
Đó là một ý tưởng khủng khiếp. Sử dụng các khóa do ứng dụng xác định một cách nhất quán hoặc các khóa do cơ sở dữ liệu xác định một cách nhất quán. Đừng trộn lẫn cả hai.