2010-01-13 6 views
6

J'ai donc ce tableau avec une clé composite, essentiellement « userID » - « données » doit être unique (voir mon autre question SQL table - semi-unique row?)Clé composite conditionnelle dans MySQL?

Cependant, je me demandais s'il était possible de faire de ce projet ne entrera en vigueur quand userID n'est pas nul? Par ce que je veux dire, 'userID' - 'données' doit être unique pour les userIDs non nulles?

Ou est-ce que j'aboie le mauvais arbre?

Merci
Mala

Répondre

5

contraintes SQL appliquent à chaque ligne de la table. Vous ne pouvez pas les conditionner en fonction de certaines valeurs de données. Cependant, si vous pouviez utiliser NULL au lieu de zéro, vous pouvez contourner la contrainte unique. Une contrainte unique permet plusieurs entrées ayant NULL. La raison en est que l'unicité signifie qu'il n'y a pas deux valeurs égales peuvent exister. L'égalité signifie value1 = value2 doit être vrai. Mais en SQL, NULL = NULL est inconnu, pas vrai.

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'); 

Jusqu'à présent, si bien, maintenant, vous pourriez penser que les déclarations suivantes violeraient la contrainte unique, mais ils ne le font pas:

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

génial, merci! Comme je l'ai dit, j'ai utilisé une solution différente, mais vous m'avez donné une réponse parfaite à ma question et je l'utiliserai sans doute dans le futur =) – Mala

Questions connexes