Itu batasan yang diketahui:urutan bertambah selama panggilan nextval()
function, yang merupakan nilai default bidang Anda. Saat Anda memberikan data di INSERT
ke bidang itu, ekspresi nilai default tidak dievaluasi, itu sebabnya nilai urutan tidak disentuh.
Solusinya adalah menyiapkan pemicu sebelum/sesudah INSERT
untuk memperbaiki nilai urutan secara manual dengan setval()
. Tapi dengan cara ini Anda seharusnya perlu menyiapkan pemicu pada UPDATE
di bidang itu juga, untuk memperbaiki nilai urutan, ketika Anda baru saja memperbarui beberapa id yang ada ke id yang lebih tinggi.
Solusi lain adalah, Anda menulis fungsi tersimpan, yang dapat menghasilkan nilai yang tersedia untuk bidang tersebut &menyetel nilai default bidang Anda ke nilai kembalian fungsi tersebut. Sesuatu, seperti:
LOOP
result = nextval('my_id_seq');
EXIT WHEN NOT EXISTS (SELECT * FROM my_table WHERE my_id = result);
END LOOP;
RETURN result;
Tetapi berhati-hatilah:fungsionalitas default untuk urutan aman untuk sisipan bersamaan (keadaan urutan saat ini bersifat global - transaksi independen). Jika Anda memberikan nilai eksplisit ke bidang tersebut, itu tidak akan terjadi.