Saya punya meja dan, entah bagaimana, orang yang sama masuk ke Person
meja saya dua kali. Saat ini, kunci utama hanya nomor otomatis tetapi ada dua bidang lain yang ada yang ingin saya paksa menjadi unik.
Misalnya, bidangnya adalah:
ID
Name
Active
PersonNumber
Saya hanya ingin 1 catatan dengan PersonNumber yang unik dan Aktif = 1.
(Jadi kombinasi dari kedua bidang harus unik)
Apa cara terbaik pada tabel yang ada di SQL server saya bisa membuatnya jadi jika orang lain melakukan penyisipan dengan nilai yang sama dengan nilai yang ada, gagal jadi saya tidak perlu khawatir tentang hal ini dalam kode aplikasi saya.
sql
sql-server
leora
sumber
sumber
Jawaban:
Setelah Anda menghapus duplikat Anda:
atau
Tentu saja, sering kali lebih baik untuk memeriksa pelanggaran ini terlebih dahulu, sebelum membiarkan SQL Server mencoba memasukkan baris dan mengembalikan pengecualian (pengecualian mahal).
http://www.sqlperformance.com/2012/08/t-sql-queries/error-handling
http://www.mssqltips.com/sqlservertip/2632/checking-for-potential-constraint-violations-before-entering-sql-server-try-and-catch-logic/
Jika Anda ingin mencegah pengecualian meluap ke aplikasi, tanpa membuat perubahan pada aplikasi, Anda dapat menggunakan
INSTEAD OF
pemicu:Tetapi jika Anda tidak memberi tahu pengguna bahwa mereka tidak melakukan penyisipan, mereka akan bertanya-tanya mengapa data tidak ada dan tidak ada pengecualian yang dilaporkan.
EDIT di sini adalah contoh yang melakukan persis apa yang Anda minta, bahkan menggunakan nama yang sama dengan pertanyaan Anda, dan membuktikannya. Anda harus mencobanya sebelum mengasumsikan ide-ide di atas hanya memperlakukan satu kolom atau yang lain sebagai lawan kombinasi ...
Data dalam tabel setelah semua ini:
Pesan kesalahan pada sisipan terakhir:
sumber
Ini juga dapat dilakukan di GUI:
sumber
new Index
tidak dapat diklik itu dinonaktifkan :(Dalam kasus saya, saya perlu mengizinkan banyak tidak aktif dan hanya satu kombinasi dari dua kunci yang aktif, seperti ini:
Ini sepertinya berhasil:
Berikut ini adalah kasus pengujian saya:
sumber
Dan jika Anda memiliki banyak kueri insert tetapi tidak ingin mengirim pesan ERROR setiap kali, Anda dapat melakukannya:
sumber