MySQL benzersiz kısıtlamalarda null değerleri yok sayar mı?


289

Benzersiz olmasını istediğim bir e-posta sütunum var. Ama aynı zamanda null değerleri kabul etmesini istiyorum. Veritabanımda bu şekilde 2 boş e-posta olabilir mi?


Yanıtlar:


424

Evet, MySQL, benzersiz bir kısıtlamaya sahip bir sütunda birden fazla NULL'a izin verir.

CREATE TABLE table1 (x INT NULL UNIQUE);
INSERT table1 VALUES (1);
INSERT table1 VALUES (1);   -- Duplicate entry '1' for key 'x'
INSERT table1 VALUES (NULL);
INSERT table1 VALUES (NULL);
SELECT * FROM table1;

Sonuç:

x
NULL
NULL
1

Bu, tüm veritabanları için geçerli değildir. Örneğin, SQL Server 2005 ve daha eski sürümleri, yalnızca benzersiz bir kısıtlaması olan bir sütunda tek bir NULL değerine izin verir.


37
MySQL'de nasıl doğru olduğuna dair mükemmel yorum, ancak genel olarak gerekli değildir.
user2910265

11
Göre SQLite SSS , davranış olduğunu MySQL, PostgreSQL, SQLite, Oracle ve Firebird aynı.
Amir Ali Akbari

4
Lütfen cevabınızı güncelleyin. SQLServer 2008+ kesinlikle buna izin verir, sadece bir WHERE yantümcesi eklemeniz gerekir ... 2017'de kimse 2008'den daha eski bir sürümde olmamalıdır ... stackoverflow.com/questions/767657/…
Mathieu Turcotte

Bu küçük özellik, veritabanına yeni bir sütun eklemeyi veya MySQL'i çok eski bir uygulamada yükseltmeyi gerektirmeyen bir cevap bulmak çok zordu. Gerçekten COALESCE kullanabileceğim Postgres gibi bir çözüm arıyordum ama cevap her zaman tasarlandığı gibi bir hata değil gibi görünüyor. WHERE column IS NOT NULLMySQL sürümümde desteklenmediği için bana başarısız bile görünmüyor. Nereye bakabileceğimi bilen var mı?
newdark-it

1
not: Bu aynı zamanda daha fazla sütuna sahip benzersiz dizinler için de geçerlidir. A, b ve c sütunlarının benzersiz olmasını istiyorsanız, yine de tablodaki null, b, c ile çift sıraya sahip olabilirsiniz
Mihai Crăiță

111

Gönderen docs :

"BENZERSİZ bir dizin NULL içerebilen sütunlar için birden çok NULL değerine izin veriyor"

Bu, BDB dışındaki tüm motorlar için geçerlidir .


3
BDB artık geçerli MySQL sürümlerinde mevcut değil (5.1.12 ile başlayarak).
Alim Özdemir

1
Testlerim Java Derby veritabanı v10.13.1.1 olduğunu gösteriyor. benzer şekilde, benzersiz bir dizine sahip bir sütunda yalnızca bir boş değere izin verir.
chrisinmtown

7

Yazarın başlangıçta bunun yinelenen değerlere izin verip vermediğini sorduğundan veya burada " NULLKullanırken yinelenen değerlere nasıl izin verilir UNIQUE?" Veya "Yalnızca bir UNIQUE NULLdeğere nasıl izin verilir ?"

Soru zaten cevaplandı, evet dizini NULLkullanırken yinelenen değerleriniz olabilir UNIQUE.

Ben "bir UNIQUE NULLdeğere nasıl izin verilir" için arama yaparken bu cevap tökezledi beri . Aynısını yaparken bu soruya rastlayabilecek herkes için, cevabımın geri kalanı sizin için ...

MySQL'de bir UNIQUE NULLdeğere sahip olamazsınız , ancak UNIQUEboş bir dizenin değeri ile ekleyerek bir boş değere sahip olabilirsiniz .

Uyarı: Dize dışındaki sayısal ve türler varsayılan olarak 0 veya başka bir varsayılan değer olabilir.


1
Kısıtlamanın dizinle ilgisi yoktur. Aslında, böyle bir satır olmamasına rağmen, NULL değerine sahip tek bir satıra bile sahip olamayacaksınız.
Pijusn

1
@Pijusn "kısıtlamanın dizinle ilgisi yok" ne demek? Ayrıca ikinci cümlenizle ilgili olarak, hiç NULL değerine sahip bir satır olabileceğini söylemedim, bu yüzden yazının başında belirtmiştim, bunun sadece null değerleri kullanmaya ayarlanmadığı takdirde bunun bir çözüm olduğunu söylemedim.
bluegman991

Demek istediğim, yeni eleman eklemenin UNIQUEkısıtlamadan değil , kısıtlamadan dolayı başarısız olması NOT NULL. Bence bu cevap soru ile alakasız çünkü soru özellikle UNIQUEkısıtlama davranışı ile ilgili .
Pijusn

@Pijusn seni yakaladım. Haklısın, aksini söyleyen ifadeleri kaldırdım. Soruyu yanlış okudum. Ancak cevabın, benzersiz bir "hiçbir şey" değerine sahip olmanın bir yolunu bulmaya çalışırken yaptığım gibi bu soruya rastlayan kullanıcılar için yararlı olabileceğine inanıyorum, ancak yanlışlıkla boşluğa izin veriyorlar.
bluegman991

1
Bu cevabı faydalı buldum. Ancak, burada da cevaplanmıştır . Bu yazı, google aramamın ilk sonucuydu, ancak bu cevap ve bağlantılı soru aradığım şeydi.
kingledion

5

Null olabilecek benzersiz kısıtlamalardan kaçının. Sütunu her zaman yeni bir tabloya yerleştirebilir, boş olmayan ve benzersiz hale getirebilir ve daha sonra bu tabloyu yalnızca bir değeriniz olduğunda doldurabilirsiniz. Bu, sütuna herhangi bir tuş bağımlılığının doğru bir şekilde uygulanmasını sağlar ve boş değerlerin neden olabileceği sorunları önler.


6
Evet, ancak teklif ettiğiniz şey mysql'in zaten sahne arkasında yaptığı şeydir. Bu işlev yerleşikse neden tekerleği yeniden icat ettiniz?
Şubat

2
Çünkü geçerli bir SQL değil. Bu ipucunun bir veritabanı agnostik tasarımı isteyen (veya ihtiyacı olan) herkes için yararlı olacağına inanıyorum.
Arsen7

@ Arsen7 Her biri birden çok müşterisi olan birden fazla işletmeniz varsa. Tüm işletmeleri müşterilerinin e-posta adresleriyle tek bir dosyada saklarsınız. Dolayısıyla, farklı işletmeler aynı istemciye sahip olabileceğinden email_address'i benzersiz yapamazsınız. Bu nedenle business_id ve email_address'in benzersiz bir dizinini oluşturmanız gerekir. Bunu açıklandığı gibi yeni bir masaya koymak mümkün mü?
Gerhard Liebenberg

4
Bir "e-posta" sütun benzersiz VEYA null olması gereken bir durum var. Tavsiyenize uyacak olursam, tek bir "e-posta" sütunuyla yeni bir tablo oluşturmanız gerekirdi. Bu Mysql'e özgü davranışa güvenmek çok daha kolaydır ve sonuç aynıdır. Müşteri, e-postayı yeni bir tabloda saklayıp saklamadığımı umursamıyor. Ayrıca, veritabanı agnostik tasarımı çoğu zaman abartılıdır. Bir çok proje için, sadece bir DB'den diğerine kolayca geçiş yapamazsınız.
conradkleinespel

1
@djmj emin, ancak işlevsel bağımlılıklar çoğu insan için önemlidir ve null olabilecek benzersiz kısıtlama sürümü BCNF sürümüyle aynı bağımlılıkları zorunlu kılmaz. Hangi seçeneğin az çok pratik olduğu sizin için hangi bağımlılıkların önemli olduğuna bağlı olabilir. Bu yüzden yeni bir tablo oluşturmayı düşünmeye değer.
nvogel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.