Saya tidak percaya ada cara sederhana yang semudah urutan biasa, karena:
- Sebuah urutan hanya menyimpan satu aliran angka (nilai berikutnya, dll.). Anda ingin satu untuk setiap partisi.
- Sequence memiliki penanganan khusus yang melewati transaksi saat ini (untuk menghindari kondisi balapan). Sulit untuk meniru ini di tingkat SQL atau PL/pgSQL tanpa menggunakan trik seperti dblink.
- Properti kolom DEFAULT dapat menggunakan ekspresi sederhana atau panggilan fungsi seperti
nextval('myseq')
; tetapi tidak dapat merujuk ke kolom lain untuk menginformasikan fungsi dari aliran mana nilai harus berasal.
Anda dapat membuat sesuatu yang berhasil, tetapi Anda mungkin tidak akan menganggapnya sederhana. Mengatasi masalah di atas secara bergantian:
- Gunakan tabel untuk menyimpan nilai berikutnya untuk semua partisi, dengan skema seperti
multiseq (partition_id, next_val)
. -
Tulis
multinextval(seq_table, partition_id)
fungsi yang melakukan sesuatu seperti berikut:- Buat transaksi baru yang independen dari transaksi saat ini (salah satu cara melakukannya adalah melalui dblink; saya yakin beberapa bahasa server lain dapat melakukannya dengan lebih mudah).
- Kunci tabel yang disebutkan di
seq_table
. - Perbarui baris dengan id partisi
partition_id
, dengan nilai yang bertambah. (Atau masukkan baris baru dengan nilai 2 jika belum ada.) - Lakukan transaksi itu dan kembalikan id yang disimpan sebelumnya (atau 1).
-
Buat pemicu penyisipan pada tabel proyek Anda yang menggunakan panggilan ke
multinextval('projects_table', NEW.Project_ID)
untuk penyisipan.
Saya sendiri belum pernah menggunakan seluruh rencana ini, tetapi saya telah mencoba sesuatu yang mirip dengan setiap langkah satu per satu. Contoh multinextval
fungsi dan pemicu dapat disediakan jika Anda ingin mencoba ini...