web-dev-qa-db-fra.com

MySQL ignore-t-il les valeurs NULL des contraintes uniques?

J'ai une colonne email que je veux être unique. Mais je veux aussi qu'il accepte les valeurs nulles. Ma base de données peut-elle avoir 2 emails nuls de cette façon?

244
Hugo Mota

Oui, MySQL autorise plusieurs NULL dans une colonne avec une contrainte unique.

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;

Résultat:

x
NULL
NULL
1

Ce n'est pas le cas pour toutes les bases de données. SQL Server 2005 et versions antérieures, par exemple, n'autorisent qu'une seule valeur NULL dans une colonne ayant une contrainte unique.

358
Mark Byers

De les docs :

"un index UNIQUE autorise plusieurs valeurs NULL pour les colonnes pouvant contenir NULL"

Ceci s'applique à tous les moteurs sauf BDB .

101
Matthew Flaschen

Pour MySql, les contraintes uniques ignorent les valeurs null, mais ce n'est pas le cas.

Un commentaire sur rapport de bug mysql # 817 dit:

La norme ANSI SQL-92 stipulait que deux valeurs NULL devaient être considérées comme "non distinctes". La définition de non distinct dans la norme ANSI inclut deux valeurs qui renvoient TRUE pour un test d'égalité ou deux NULL. C'est pourquoi GROUP BY regroupe toutes les valeurs NULL dans une seule partition.

MySql doit accepter les valeurs NULL dans le cadre de la contrainte unique.

34
Yorro

Je ne suis pas sûr si l'auteur demandait simplement si cela autorisait les valeurs en double ou s'il y avait une question implicite ici: "Comment autoriser les valeurs en double NULL en utilisant UNIQUE?" Ou "Comment autoriser une seule valeur UNIQUENULL?"

La question a déjà été répondue, oui vous pouvez dupliquer les valeurs NULL en utilisant l’indice UNIQUE.

Depuis que je suis tombé sur cette réponse en cherchant "comment autoriser une valeur UNIQUENULL." Pour quiconque pourrait trébucher sur cette question tout en faisant la même chose, le reste de ma réponse est pour vous ...

Dans MySQL, vous ne pouvez pas avoir une valeur UNIQUENULL, cependant vous pouvez avoir une valeur UNIQUE vide en l'insérant avec la valeur d'une chaîne vide.

Avertissement: Les types numériques et autres que chaîne peuvent utiliser par défaut 0 ou une autre valeur par défaut.

6
bluegman991

Évitez les contraintes uniques nullables. Vous pouvez toujours placer la colonne dans une nouvelle table, la rendre non nulle et unique, puis renseigner cette table uniquement lorsque vous en avez la valeur. Cela garantit que toute dépendance de clé sur la colonne peut être correctement appliquée et évite les problèmes pouvant être causés par des valeurs NULL.

4
nvogel