2013-07-05 24 views
6

NULL'ler içerebilen bir sütun üzerinde Benzersiz Bir Kısıtlama oluşturulabilir. Bununla birlikte, en çok, yalnızca bir satır bu sütunda bir NULL içerebilir.Benzersiz Kısıtlama sütunu yalnızca bir NULL değeri içerebilir

Tanım gereği, bir NULL öğesinin başka bir NULL'a eşit olmadığından (NULL gerçekten bilinmeyen bir değer olduğundan ve bilinmeyen bir değer başka bir bilinmeyen değere eşit olmadığı için) neden böyle olduğunu anlamıyorum.

Sorularım: 1. Neden böyle? 2. Bu, MsSQL'e özgü midir?

Bunun bir önsözüm var çünkü bir Yabancı Kısıtlama, bir Yabancı Anahtar için bir referans alanı olarak hareket edebilir ve FK'nin, referans tablosunda hangi kayıt için birden fazla kayıt varsa, hangi kayıt olduğunu bilmeyeceğini NULL vardı. Ama bu sadece bir önsezidir.

(Evet, UCS birden çok sütun için olabileceğini biliyoruz, ama bu soruyu değişmez; doğrusu sadece bunu biraz zorlaştırmaktadır.)

+0

CREATE TABLE ifadesini yapıştırabilirsiniz.Gerçek NULL –

+0

Adil yorum yerine dize olarak 'NULL' değerlerini ayarlayabilir misiniz, ancak hayır, bir dize değil; bu bir tamsayı alanıdır. Varolan bir tamsayı değeri girilmeye veya NULL sonuçlarına "UNIQUE KEY kısıtlaması ihlali ... Nesne nesnesine yinelenen anahtar eklenemiyor ..." –

cevap

7

Evet, Microsoft SQL Server "spesifik" var (Bu bazı diğer veritabanı sistemleri, beklediğiniz karşı yaklaşım var - ve ANSI standardında tanımlanan, ancak SQL Server ile aynı olan diğer veritabanı sistemleri olduğuna inanıyorum).

filtrelenen endeksleri destekleyen bir SQL Server sürümünde çalışıyorsanız, onlardan birini uygulayabilirsiniz:

CREATE UNIQUE INDEX IX_T ON [Table] ([Column]) WHERE [Column] IS NOT NULL 

(Ancak bu indeks bir FK kısıtlaması hedefi olamaz unutmayın)


"Neden" o gerçekten sadece o uzun zaman önce (muhtemelen ön standartları) nasıl uygulandığına ve o potansiyel var olan bir sürü kırılabilir şimdi değiştirmek için bu garip durumlardan biri, aşağı gelir sistemleri.

Re: Yabancı Anahtarlar - bir yabancı anahtar sütunundaki NULL değerinin, yabancı anahtarın işaretlenmemesine neden olmaması doğruysa, doğru olur (SQL Server'da) Gerçek bir anahtar olarak NULL.

+0

Anlayışımın anlaşılmasına yardımcı oluyor, teşekkürler. Bu örnekte, durumu "bir sorunu düzeltmekten" çok anlamaya çalışıyordum. Ve, DOH, FK hipotezime; İzin verilen NULL'leri hatırlamam gerekirdi. –

+0

YABANCI BIR KEY kısıtı kesinlikle * Standart SQL'de ve SQL Server'da boş değerlere izin verir. Nullable FK kısıtlamaları, başvurulan ana tabloda bulunup bulunmadığına bakılmaksızın boş değerlere izin verir. – sqlvogel

+0

@sqlvogel - demek istediğim, başvuru tablosundaki "NULL" değerinin, başvurulan tabloda kontrol edilmemesidir. 'NULL' anahtar bir değer olamaz. –

3

Evet, bir SQL Server özelliği (ve diğer birkaç DBMS'lerin bir özelliği), ISO SQL standardına aykırıdır. SQL'deki null'lara uygulanan mantık dikkate alındığında belki de mantıklı değil. Ancak ISO SQL Standardı, null'ların da tedavisi konusunda çok tutarlı değil. Standart SQL'deki null teklik kısıtlamalarının davranışı çok yardımcı olmaz. Bu tür kısıtlamalar mutlaka "benzersiz" değildir, çünkü çift satırlara izin verirler. Ör aşağıdaki satırları izin UNIQUE(foo,bar) kısıt bir tabloda aynı anda var olmaya: (!)

foo bar 
------ ------ 
999 NULL 
999 NULL 

null tekliği kısıtlamaları kaçının. Sütunları yeni bir tabloya null olmayan sütunlar olarak taşımak ve orada benzersizliği kısıtlamak genellikle kolaydır. Bu sütunları boş değerlerle doldurarak temsil edilebilecek bilgiler (muhtemelen), bu sütunları yeni tabloda tümüyle göstermeyerek temsil edilebilir.

İlgili konular