Saya memiliki persyaratan bisnis yang setiap catatan dalam tabel Faktur memiliki id yang terlihat seperti YYYYNNNNNNN.
Bagian NNNNNN perlu memulai kembali pada awal setiap tahun. Jadi baris pertama yang dimasukkan pada 2016 akan terlihat seperti 2016000001 dan yang kedua seperti 2016000002 dll. Katakanlah rekor terakhir untuk 2016 adalah 2016123456, Baris berikutnya (tahun 2017) akan terlihat seperti 2017000001
Saya tidak perlu id ini menjadi kunci utama dan saya menyimpan tanggal pembuatan juga. Idenya adalah bahwa 'tampilan id' ini unik (jadi saya bisa menanyakannya) dan dapat dikelompokkan berdasarkan manusia, berdasarkan tahun.
Tidak mungkin ada catatan yang akan dihapus; Namun, saya akan cenderung kode pertahanan terhadap sesuatu seperti itu.
Apakah ada cara saya bisa membuat id ini tanpa harus mencari id maksimum tahun ini setiap kali memasukkan baris baru?
Ide ide:
- A
CreateNewInvoiceSP
, yang mendapatMAX
nilai untuk tahun itu (yucky) - Beberapa fitur magis bawaan untuk melakukan hal ini (saya dapat bermimpi dengan benar)
- Mampu menentukan beberapa UDF atau sesuatu di dalam
IDENTITY
atauDEFAULT
deklarasi (??) - Tampilan yang menggunakan
PARTITION OVER + ROW()
(dihapus akan bermasalah) - Pemicu aktif
INSERT
(masih perlu menjalankan beberapaMAX
permintaan :() - Pekerjaan latar belakang tahunan, memperbarui meja dengan MAX untuk setiap tahun dimasukkan yang kemudian saya ... Sesuatu ?!
Semuanya agak tidak ideal. Ada ide atau variasi yang disambut baik!
sumber
Jawaban:
Ada 2 elemen untuk bidang Anda
Mereka tidak perlu disimpan sebagai satu bidang
Contoh:
YEAR(GETDATE())
Lalu buat kolom terkomputasi yang menyatukan mereka (dengan pemformatan yang sesuai). Urutan dapat diatur ulang saat pergantian tahun.
Contoh kode dalam SQLfiddle : * (SQLfiddle tidak selalu berfungsi)
sumber
SEQUENCE
pada awal setiap tahun?NEXT VALUE FOR
dalamCASE
pernyataan (saya mencoba)Apakah Anda mempertimbangkan untuk membuat bidang identitas dengan seed = 2016000000?
Benih ini harus ditingkatkan secara otomatis setiap tahun, misalnya pada malam 2017/1/1 Anda harus menjadwalkan
Tapi saya sudah melihat masalah dengan desain, misalnya: bagaimana jika Anda memiliki jutaan catatan?
sumber
Apa yang saya lakukan dalam skenario ini adalah mengalikan tahun dengan 10 ^ 6 dan menambahkan nilai urutan itu. Ini memiliki keuntungan karena tidak memerlukan bidang yang dikomputasi dengan overhead kecil yang sedang berlangsung dan bidang tersebut dapat digunakan sebagai a
PRIMARY KEY
.Ada dua kemungkinan gotcha:
pastikan bahwa pengganda Anda cukup besar agar tidak pernah habis, dan
Anda tidak dijamin urutan tanpa celah karena caching urutan.
Saya bukan ahli SQL Server, tetapi Anda mungkin dapat mengatur acara untuk memicu pada 201x 00:00:00 untuk mengatur ulang urutan Anda ke nol. Itu juga yang saya lakukan di Firebird (atau apakah itu Interbase?).
sumber
Sunting: Solusi ini tidak berfungsi di bawah beban
Saya bukan penggemar pemicu, tapi sepertinya ini yang terbaik yang bisa saya lakukan.
Pro:
Edit: Kontra:
(Kredit untuk @gbn ketika saya mengambil beberapa inspirasi dari jawaban mereka) (Umpan balik & menunjukkan kesalahan yang jelas, selamat datang :)
Tambahkan beberapa
COLUMN
s dan baruINDEX
Tambahkan yang baru
TRIGGER
sumber
NULL
nilai yang dimasukkan. Kembali ke papan gambar ...ON Previous.Id = (I.Id -1)
hanya harus mencari), tapi ya masih tidak berfungsi. Jika saya bisa mengunci tabel (?) Selama memasukkan dan memicu maka saya pikir itu akan berhasil. Tapi itu terdengar seperti bau kode juga.