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.
741
demandé sur New Alexandria 2009-03-11 22:12:31

11 réponses

ALTER TABLE `votes` ADD UNIQUE `unique_index`(`user`, `email`, `address`);
1233
répondu jonstjohn 2014-06-04 11:46:23

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.

194
répondu Frodik 2017-04-24 18:44:17

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...

43
répondu niksoft 2010-05-07 21:21:31

Avez-vous essayé ?

UNIQUE KEY `thekey` (`user`,`email`,`address`)
22
répondu Erick 2009-03-11 19:14:24

Cela fonctionne pour mysql version 5.5.32

ALTER TABLE  `tablename` ADD UNIQUE (`column1` ,`column2`);
11
répondu rizon 2014-02-05 08:55:56

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.

6
répondu Vince K 2014-03-20 00:40:34

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

4
répondu Cristian Botiza 2014-08-03 12:56:47

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);
1
répondu kumar 2013-03-09 23:01:40

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`);
1
répondu sandeep vanama 2016-11-22 14:07:03

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.

1
répondu LXXIII 2018-06-27 21:20:18

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)
);
0
répondu Devendra Singraul 2018-10-09 05:50:17