Bidang bertambah otomatis yang bergantung pada bidang lain [duplikat]

Saya memiliki dua model, A dan B. A memiliki banyak B. Awalnya, A dan B memiliki bidang kunci utama yang bertambah secara otomatis yang disebut id, dan B memiliki bidang a_id. Sekarang saya mendapati diri saya membutuhkan urutan angka unik untuk setiap B dalam A. Saya mencatat hal ini dalam aplikasi saya, tapi kemudian saya berpikir akan lebih masuk akal jika membiarkan database mengurusnya. Saya pikir saya bisa memberikan B kunci gabungan di mana komponen pertama adalah a_id dan komponen kedua bertambah secara otomatis, dengan mempertimbangkan a_id. Jadi jika saya memasukkan dua catatan dengan a_id 1 dan satu dengan a_id 2 maka saya akan memiliki sesuatu seperti:

a_id | other_id
   1 |        1
   1 |        2
   2 |        1

Jika id dengan angka lebih rendah dihapus, maka urutannya tidak boleh mendaur ulang angka-angka ini. Jadi jika (1, 2) terhapus:

a_id | other_id
   1 |        1
   2 |        1

Ketika record berikutnya dengan a_id 1 ditambahkan, tabel akan terlihat seperti:

a_id | other_id
   1 |        1
   2 |        1
   1 |        3

Bagaimana saya bisa melakukan ini di SQL? Apakah ada alasan untuk tidak melakukan hal seperti ini?

Saya menggunakan H2 dalam memori (pengujian dan pengembangan) dan PostgreSQL 9.3 (produksi).


person mushroom    schedule 27.12.2013    source sumber
comment
SQL hanyalah Bahasa Kueri Terstruktur - bahasa yang digunakan oleh banyak sistem basis data, namun bukan produk basis data... banyak hal yang bersifat vendor- spesifik - jadi kami benar-benar perlu mengetahui sistem basis data (dan versi mana) yang Anda gunakan (harap perbarui tag yang sesuai)..   -  person marc_s    schedule 27.12.2013
comment
mengapa kamu membutuhkan ini?   -  person T McKeown    schedule 27.12.2013
comment
@marc_s Lihat pembaruan. Saya mencoba untuk menjadi vendor yang tidak spesifik mungkin.   -  person mushroom    schedule 28.12.2013
comment
Apakah other_id benar-benar seharusnya menjadi id? jika baris dengan other_id lebih rendah untuk a_id yang sama dihapus, apakah other_id harus diperbarui atau tidak? Jika baris dengan other_id maksimum dihapus dan kemudian baris lain disisipkan, apakah other_id baris tersebut seharusnya +1?   -  person Max♦    schedule 28.12.2013
comment
@Max other_id tidak boleh diperbarui jika angka yang lebih rendah dihapus. Terima kasih telah menunjukkan hal ini. Saya akan memperbarui pertanyaannya.   -  person mushroom    schedule 28.12.2013


Jawaban (1)


Jawaban atas pertanyaan Anda adalah Anda memerlukan pemicu untuk mendapatkan fungsi ini. Namun, Anda bisa membuat tampilan yang menggunakan fungsi row_number():

create view v_table as
    select t.*,
           row_number() over (partition by a order by id) as seqnum
    from table t;

Di mana saya memanggil kunci utama untuk tabel id.

person Gordon Linoff    schedule 27.12.2013
comment
Ini hanya berfungsi selama angka yang lebih rendah tidak dihapus, lihat komentar di atas. Jika angka yang lebih rendah dihapus, nomor_baris juga akan diperbarui yang tidak seharusnya terjadi. - person Max♦; 28.12.2013
comment
Silakan lihat pembaruan mengenai penghapusan. Apa yang as seqnum lakukan? Saya mencoba mencarinya tetapi tidak menemukan apa pun. - person mushroom; 28.12.2013
comment
karena seqnum hanya memberi nama pada kolom. - person Max♦; 28.12.2013
comment
@jamur . . . Jika Anda ingin nilainya tetap ada setelah penghapusan, menurut saya Anda perlu menggunakan pemicu. - person Gordon Linoff; 28.12.2013