2010-01-13 35 views
6

Bu yüzden bir bileşik anahtar, temelde 'kullanıcı kimliği' ile bu tabloyu var - benzersiz olmalıdır 'veri' bunun sadece yürürlüğe yapmak mümkün olsaydı ben merak AncakMySQL'de koşullu birleşik anahtar mı?

(benim diğer soruya SQL table - semi-unique row? bakınız) userID sıfır olmadığında? Bununla, 'userID' - 'data' sıfır olmayan kullanıcı ID'leri için benzersiz olmalıdır?

Yoksa yanlış kapıyı çalıyorsun ben?

Teşekkür
Mala

cevap

5

SQL kısıtlamaları tablosundaki her satır için geçerlidir. Belirli veri değerlerine göre bunları koşullu yapamazsınız. yerine sıfır NULL kullanabilirsiniz eğer

Ancak, benzersiz kısıtlama etrafında alabilirsiniz. Benzersiz bir kısıtlama, NULL olan birden çok girdiye izin verir. nedeni benzersizliği var olabilir hiçbir iki eşit değerler anlamına gelmesidir. Eşitlik, value1 = value2'un doğru olması gerektiği anlamına gelir. Ama SQL, NULL = NULL gerçek bilinmeyen değildir.

CREATE TABLE MyTable (id SERIAL PRIMARY KEY, userid INT, data VARCHAR(64)); 

INSERT INTO MyTable (userid, data) VALUES ( 1, 'foo'); 
INSERT INTO MyTable (userid, data) VALUES ( 1, 'bar'); 
INSERT INTO MyTable (userid, data) VALUES (NULL, 'baz'); 

Şimdiye kadar iyi, şimdi aşağıdaki ifadeleri benzersiz kısıtlamayı ihlal eden düşünebilir, ama yok:

INSERT INTO MyTable (userid, data) VALUES ( 1, 'baz'); 
INSERT INTO MyTable (userid, data) VALUES (NULL, 'foo'); 
INSERT INTO MyTable (userid, data) VALUES (NULL, 'baz'); 
INSERT INTO MyTable (userid, data) VALUES (NULL, 'baz'); 
+0

müthiş, teşekkür! Farklı bir çözüm kullandım dediğim gibi, ama bana sorusuma mükemmel bir cevap verdiniz ve şüphesiz ben bunu gelecekte kullanacağım =) – Mala

İlgili konular