Saya menggunakan SQL Server 2005. Saya ingin membatasi nilai dalam kolom menjadi unik, sambil mengizinkan NULLS.
Solusi saya saat ini melibatkan indeks unik pada tampilan seperti ini:
CREATE VIEW vw_unq WITH SCHEMABINDING AS
SELECT Column1
FROM MyTable
WHERE Column1 IS NOT NULL
CREATE UNIQUE CLUSTERED INDEX unq_idx ON vw_unq (Column1)
Ada ide yang lebih baik?
sql
sql-server
indexing
constraints
unique
Nuno G
sumber
sumber
Jawaban:
Cukup yakin Anda tidak bisa melakukan itu, karena itu melanggar tujuan unik.
Namun, orang ini tampaknya memiliki solusi yang layak: http://sqlservercodebook.blogspot.com/2008/04/multiple-null-values-in-unique-index-in.html
sumber
Menggunakan SQL Server 2008, Anda dapat membuat indeks yang difilter: http://msdn.microsoft.com/en-us/library/cc280372.aspx . (Saya melihat Simon menambahkan ini sebagai komentar, tetapi saya pikir itu pantas mendapatkan jawabannya sendiri karena komentar itu mudah terlewat.)
Pilihan lain adalah pemicu untuk memeriksa keunikan, tetapi ini dapat memengaruhi kinerja.
sumber
create unique index UIX on MyTable (Column1) where Column1 is not null
ANSI_NULLS
adalahON
, jika tidak Anda akan mendapatkan error ketika mencoba untuk memasukkan data.Trik kolom terhitung secara luas dikenal sebagai "nullbuster"; catatan saya memuji Steve Kass:
sumber
Sebenarnya, kolom unik nullable (atau kumpulan kolom) dapat berupa NULL (atau catatan NULL) hanya sekali, karena memiliki nilai yang sama (dan ini termasuk NULL) lebih dari sekali jelas melanggar batasan unik.
Namun, itu tidak berarti konsep "kolom nullable unik" valid; untuk benar-benar menerapkannya dalam database relasional apa pun, kita hanya perlu mengingat bahwa jenis database ini dimaksudkan untuk dinormalisasi agar berfungsi dengan baik, dan normalisasi biasanya melibatkan penambahan beberapa tabel tambahan (non-entitas) untuk membangun hubungan antara entitas. .
Mari bekerja contoh dasar dengan mempertimbangkan hanya satu "kolom nullable unik", mudah untuk memperluasnya ke lebih banyak kolom seperti itu.
Misalkan kita informasi direpresentasikan oleh tabel seperti ini:
Kita dapat melakukannya dengan memisahkan uniqnull dan menambahkan tabel kedua untuk membuat hubungan antara nilai uniqnull dan the_entity (daripada memiliki uniqnull "di dalam" the_entity):
Untuk mengaitkan nilai uniqnull ke baris di the_entity kita juga perlu menambahkan baris di the_relation.
Untuk baris di the_entity tidak ada nilai uniqnull yang diasosiasikan (yaitu untuk baris yang akan kita masukkan NULL di the_entity_incorrect) kita tidak menambahkan baris di the_relation.
Perhatikan bahwa nilai uniqnull akan unik untuk semua the_relation, dan juga perhatikan bahwa untuk setiap nilai dalam the_entity paling banyak dapat ada satu nilai dalam the_relation, karena kunci utama dan asing di atasnya memberlakukan ini.
Kemudian, jika nilai 5 untuk uniqnull akan dikaitkan dengan id the_entity dari 3, kita perlu:
Dan, jika nilai id 10 untuk the_entity tidak memiliki pasangan uniqnull, kita hanya melakukan:
Untuk mendenormalisasi informasi ini dan mendapatkan data tabel seperti the_entity_incorrect, kita perlu:
Operator "left outer join" memastikan semua baris dari the_entity akan muncul dalam hasil, meletakkan NULL di kolom uniqnull saat tidak ada kolom yang cocok di the_relation.
Ingat, setiap upaya yang dilakukan selama beberapa hari (atau minggu atau bulan) dalam mendesain database yang dinormalisasi dengan baik (dan tampilan dan prosedur denormalisasi yang sesuai) akan menghemat waktu bertahun-tahun (atau dekade) dari rasa sakit dan sumber daya yang terbuang percuma.
sumber