Saya memiliki database yang tidak dalam produksi, jadi tabel utamanya adalah CustodyDetails, tabel ini memiliki ID int IDENTITY(1,1) PRIMARY KEY
kolom dan saya sedang mencari cara menambahkan pengidentifikasi unik yang tidak direferensikan di tabel lain, saya akan berpikir dengan mengambil ini di akun isi kolom tidak akan persis kunci identitas.
Kolom identitas baru ini memiliki beberapa detail spesifik, dan di sinilah masalah saya dimulai. Formatnya adalah sebagai berikut: di XX/YY
mana XX adalah nilai tambah otomatis yang mengatur ulang / memulai kembali setiap tahun baru dan YY adalah 2 digit terakhir tahun ini SELECT RIGHT(YEAR(GETDATE()), 2)
.
Jadi misalnya mari kita berpura-pura satu catatan ditambahkan sehari mulai dari 28/12/2015 yang berakhir pada 03/01/2016 , kolomnya akan terlihat seperti:
ID ID2 DATE_ADDED
1 1/15 2015-12-28
2 2/15 2015-12-29
3 3/15 2015-12-30
4 4/15 2015-12-31
5 1/16 2016-01-01
6 2/16 2016-01-02
7 3/16 2016-01-03
Saya berpikir untuk menggunakan frontend untuk mengurai ID komposit (ID2 dalam contoh) mendapatkan 2 digit terakhir dan membandingkannya dengan 2 digit terakhir tahun ini dan kemudian memutuskan apakah akan memulai korelatif baru atau tidak. Tentu saja akan luar biasa untuk dapat melakukan semuanya di sisi basis data.
EDIT 1: btw, saya juga melihat orang menggunakan tabel terpisah hanya untuk menyimpan kunci identitas paralel, jadi satu tabel kunci Identitas menjadi kunci kedua tabel sekunder, ini terdengar agak cerdik tapi mungkin ini kasus implementasi seperti itu terjadi?
EDIT 2: ID tambahan ini adalah referensi dokumen lawas yang memberi label setiap file / catatan. Saya kira orang bisa menganggapnya sebagai alias khusus untuk ID utama.
Jumlah catatan yang ditangani oleh database ini setiap tahun belum mencapai 100 dalam 20 tahun terakhir dan sangat (sangat, sangat sangat) mustahil untuk dilakukan, tentu saja jika melebihi 99, maka bidang tersebut akan dapat Lanjutkan dengan digit tambahan dan frontend / prosedur akan dapat melampaui 99, jadi itu tidak seperti itu mengubah hal-hal.
Tentu saja beberapa perincian ini tidak saya sebutkan di awal karena mereka hanya akan mempersempit kemungkinan solusi untuk memenuhi kebutuhan spesifik saya, mencoba untuk menjaga jangkauan masalah yang lebih luas.
ID
= 5, 6, dan 7, DATE_ADDED seharusnya2016-01-01
dan seterusnya?Jawaban:
Anda bisa menggunakan tabel kunci untuk menyimpan bagian incrementing dari kolom ID kedua Anda. Solusi ini tidak bergantung pada kode sisi klien, dan secara otomatis multi-tahun sadar; ketika
@DateAdded
parameter melewati pada tahun yang sebelumnya tidak digunakan, itu akan secara otomatis mulai menggunakan set nilai baru untukID2
kolom, berdasarkan tahun itu. Jika proc secara konsekuen digunakan untuk menyisipkan baris dari tahun-tahun sebelumnya, baris-baris itu akan disisipkan dengan nilai "benar" untuk kenaikan. TheGetNextID()
proc diarahkan untuk menangani kemungkinan deadlock anggun, hanya melewati kesalahan ke pemanggil jika 5 deadlock berurutan terjadi ketika mencoba untuk memperbaruitblIDs
tabel.Buat tabel untuk menyimpan satu baris per tahun yang berisi nilai ID yang saat ini digunakan, bersama dengan prosedur tersimpan untuk mengembalikan nilai baru untuk digunakan:
Meja Anda, bersama dengan proc untuk menyisipkan baris ke dalamnya:
Masukkan beberapa data sampel:
Tampilkan kedua tabel:
Hasil:
Tabel kunci dan proc yang disimpan berasal dari pertanyaan ini .
sumber
(IDName, LastID)
baris yang sama , apakah itu akan menghasilkan jalan buntu atau salah satu transaksi melanggar PK? Jika yang terakhir, mungkin masuk akal untuk memberikan transaksi itu kesempatan lain (sehingga akhirnya akan mendapatkan ID 2).@NewID
secara eksplisit ke nol pada awal loop: jika transaksi yang mencoba memasukkan baris menjadi korban kebuntuan, itu tidak akan mencoba untuk memasukkan baris pada iterasi berikutnya, karena@NewID
sudah akan memiliki telah diatur ke 1 (yang bukan NULL, sehingga cabang INSERT akan dihilangkan).tblIDs
tabel karena tabel itu diperbarui oleh operasi atom tunggal; pembaruan "aneh".@NewID = NULL
pada awal loop.