Saya tidak mengetahui cara yang aman dan efisien untuk melakukan apa yang Anda inginkan. Anda harus benar-benar memilih apakah Anda ingin menentukan kunci sendiri atau menggunakan kunci yang dibuat dan tetap berpegang pada satu strategi atau yang lain.
Jika Anda tidak keberatan dengan konkurensi yang buruk, Anda dapat LOCK TABLE thetable
, lakukan pekerjaanmu, setval
urutan pengidentifikasi tabel ke nilai bebas berikutnya setelah apa yang Anda masukkan, dan commit
untuk melepaskan kunci. Namun, itu masih akan menyebabkan masalah dengan aplikasi yang secara eksplisit memanggil nextval
(seperti banyak ORM) daripada membiarkan database menentukan nilai dengan menghilangkannya dari ?INSERT
daftar kolom atau secara eksplisit menamakannya sebagai DEFAULT
.
Kalau tidak, Anda dapat meminta kode Anda (atau fungsi pembantu PL/PgSQL) melakukan penyisipan dalam loop coba lagi yang menambah kunci dan mencoba lagi ketika mendapat kesalahan integritas. Strategi ini tidak akan berhasil jika Anda perlu melakukan lebih dari sekadar memasukkan satu per transaksi. Selanjutnya di SERIALIZABLE
mode isolasi Saya rasa Anda tidak dapat melakukannya dengan PL/PgSQL, Anda harus menggunakan loop coba ulang sisi klien untuk menangani kegagalan serialisasi.
Itu ide yang buruk. Gunakan kunci yang ditentukan aplikasi secara konsisten, atau kunci yang ditentukan basis data secara konsisten. Jangan mencampur keduanya.