6 votes

Multiple unique dans mysql ne supportant pas NULL

ALTER TABLE admins ADD CONSTRAINT uc_EmailandDeleted_at UNIQUE (email,deleted_at);

J'ai modifié mon tableau pour qu'il fonctionne comme ceci :

ID  EMAIL                  DELETED_AT  
1.  user@example.com          NULL             <- accept  
2.  user@example.com          NULL             <- reject because of uniqueness.

Mais cela ne fonctionne pas comme je le souhaite. Si je donne deux dates identiques à

deleted\_atIl génère des erreurs comme je m'y attendais. Mais pas pour les valeurs NULL. Avez-vous une idée ?

NB : Je ne peux pas changer les comportements de deleted_at car j'utilise la colonne acts_as_paranoid. Je dois donc garder deleted_at pour être NULL ou une date quelconque.

7voto

Joe Stefanelli Points 72874

De la documentation :

Un index UNIQUE crée une contrainte telle que toutes les valeurs de l'index doivent être distinctes. Une erreur se produit si vous essayez d'ajouter une nouvelle ligne dont la valeur de la clé correspond à une valeur existante. valeur de clé qui correspond à une ligne existante. Cette contrainte ne s'applique pas aux valeurs NULL, sauf pour le moteur de stockage BDB. Pour les autres moteurs, un index UNIQUE autorise plusieurs valeurs NULL pour les colonnes qui peuvent contenir des valeurs NULL. NULL.

L'extrait ci-dessus provient de MySQL 5.0. MySQL a abandonné le moteur de stockage BDB dans la version 5.1.12. Donc maintenant, à partir de la dernière version documentation :

Pour tous les moteurs, un index UNIQUE permet des valeurs NULL multiples pour les colonnes qui peuvent contenir NULL. Si vous spécifiez une valeur de préfixe pour une colonne dans un index UNIQUE, les valeurs de la colonne doivent être uniques dans le préfixe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X