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 uniques (ensemble).
Comment puis-je faire cela dans MySql?
- bien sûr, l'exemple est juste... exemple. Alors ne vous inquiétez pas de la sémantique.
11 réponses
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 comme prévu, elle permet plusieurs lignes nulles de id_box_elements et id_router.
Je cours MySQL 5.1.42, donc probablement il y a eu une mise à jour sur le problème discuté ci-dessus. Heureusement, cela fonctionne et j'espère que cela restera comme ça.
Les index uniques multi-colonnes ne fonctionnent pas dans MySQL si vous avez une valeur NULL dans row car MySQL traite NULL comme une valeur unique et n'a au moins actuellement aucune logique pour contourner cela dans les index multi-colonnes. Oui, le comportement est fou, car il limite beaucoup d'applications légitimes d'index multi-colonnes, mais c'est ce que c'est... Pour l'instant, c'est un bug qui a été estampillé "ne corrigera pas" sur la piste de bogue MySQL...
Avez-vous essayé ?
UNIQUE KEY `thekey` (`user`,`email`,`address`)
Cela fonctionne pour mysql version 5.5.32
ALTER TABLE `tablename` ADD UNIQUE (`column1` ,`column2`);
Vous pouvez ajouter des index uniques à plusieurs colonnes via phpMyAdmin . (J'ai testé dans la version 4.0.4)
Accédez à la pagestructure pour votre table cible. Ajouter un index unique à l'une des colonnes. Développez la liste Index en bas de la page structure pour voir l'index unique que vous venez d'ajouter. Cliquez sur l'icône Modifier et dans la boîte de dialogue suivante, vous pouvez ajouter 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
- lors de l'évaluation d'une telle contrainte, vous pouvez avoir (a, null) autant de fois que vous le souhaitez (même valeur!)
- vous ne pouvez avoir qu'une paire (a, pas null B)
Exemple: NOM_PRODUIT, VERSION_PRODUIT 'verre', null 'verre', null 'vin', 1
Maintenant, si vous essayez de insert ('wine' 1) encore une fois, il signalera une violation de contrainte J'espère que cela aide
Si vous voulez é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 ajouter un index unique, les éléments suivants sont requis:
1) table_name
2) index_name
3) colonnes sur lesquelles vous souhaitez ajouter 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 <votesuniqueindex>;(`user` ,`email`,`address`);
Je le fais comme ceci:
CREATE UNIQUE INDEX index_name ON TableName (Column1, Column2, Column3);
Ma convention pour un index_name
unique est TableName_Column1_Column2_Column3_uindex
.
Si vous créez une table dans mysql, utilisez ce qui suit:
create table package_template_mapping (
mapping_id int(10) not null auto_increment ,
template_id int(10) NOT NULL ,
package_id int(10) NOT NULL ,
remark varchar(100),
primary key (mapping_id) ,
UNIQUE KEY template_fun_id (template_id , package_id)
);