Comment spécifier une contrainte unique pour plusieurs colonnes dans MySQL?

J’ai une table:

table votes ( id, user, email, address, primary key(id), ); 

Maintenant, je veux rendre les colonnes utilisateur, email, adresse unique (ensemble).

Comment est-ce que je fais ceci dans MySql?

  • Bien sûr, l’exemple n’est qu’un exemple. Alors s’il vous plaît ne vous inquiétez pas de la sémantique.

 ALTER TABLE `votes` ADD UNIQUE `unique_index`(`user`, `email`, `address`); 

J’ai une table MySQL:

 CREATE TABLE `content_html` ( `id` int(11) NOT NULL AUTO_INCREMENT, `id_box_elements` int(11) DEFAULT NULL, `id_router` int(11) DEFAULT NULL, `content` mediumtext COLLATE utf8_czech_ci NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `id_box_elements` (`id_box_elements`,`id_router`) ); 

et la clé UNIQUE fonctionne exactement comme prévu, elle autorise plusieurs lignes NULL d’id_box_elements et id_router.

J’utilise MySQL 5.1.42, donc il y a probablement eu quelques mises à jour sur le problème discuté ci-dessus. Heureusement, ça marche et j’espère que ça va restr comme ça.

Les index uniques multi-colonnes ne fonctionnent pas dans MySQL si vous avez une valeur NULL dans la ligne car MySQL traite NULL comme une valeur unique et au moins n’a actuellement aucune logique pour le contourner dans les index multi-colonnes. Oui, le comportement est insensé, car il limite beaucoup d’applications légitimes des index multi-colonnes, mais c’est ce qu’il est … A ce jour, c’est un bug qui a été marqué avec “ne va pas réparer” sur MySQL bug-track …

Avez-vous essayé cela?

 UNIQUE KEY `thekey` (`user`,`email`,`address`) 

Cela fonctionne pour mysql version 5.5.32

 ALTER TABLE `tablename` ADD UNIQUE (`column1` ,`column2`); 

Vous pouvez append des index uniques à plusieurs colonnes via phpMyAdmin . (J’ai testé dans la version 4.0.4)

Accédez à la page de structure de votre table cible. Ajoutez un index unique à l’une des colonnes. Développez la liste Index au bas de la page de structure pour voir l’index unique que vous venez d’append. Cliquez sur l’icône de modification et, dans la boîte de dialog suivante, vous pouvez append des colonnes supplémentaires à cet index unique.

MySql 5 ou supérieur se comporte comme ceci (je viens de tester):

  • Vous pouvez définir des contraintes uniques impliquant des colonnes nullables. Disons que vous définissez une contrainte unique (A, B) où A n’est pas nullable mais B est
  • en évaluant une telle contrainte, vous pouvez avoir (A, null) autant de fois que vous voulez (même valeur A!)
  • vous ne pouvez avoir qu’une seule paire (A, pas nulle B)

Exemple: PRODUCT_NAME, PRODUCT_VERSION ‘glass’, null ‘glass’, null ‘wine’, 1

Maintenant, si vous essayez à nouveau d’insérer (“wine” 1), il signalera une violation de contrainte. J’espère que cela vous aidera

Si vous souhaitez éviter les doublons à l’avenir. Créer une autre colonne dire id2.

 UPDATE tablename SET id2 = id; 

Ajoutez maintenant l’unique sur deux colonnes:

 alter table tablename add unique index(columnname, id2); 

Pour append un index unique, les éléments suivants sont requirejs:

1) nom_table
2) nom_index
3) colonnes sur lesquelles vous voulez append un index

 ALTER TABLE `tablename` ADD UNIQUE index-name (`column1` ,`column2`,`column3`,...,`columnN`); 

Dans votre cas, nous pouvons créer un index unique comme suit:

 ALTER TABLE `votes`ADD UNIQUE ;(`user` ,`email`,`address`); 

Je le fais comme ça:

 CREATE UNIQUE INDEX index_name ON TableName (Column1, Column2, Column3); 

Ma convention pour un index_name unique est TableName_Column1_Column2_Column3_uindex .