web-dev-qa-db-fra.com

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 faire les colonnes utilisateur, email, adresse unique (ensemble).

Comment est-ce que je fais ceci dans MySql?

  • Bien sûr, l'exemple est juste ... un exemple. Alors, ne vous inquiétez pas pour la sémantique.
771
Niyaz
ALTER TABLE `votes` ADD UNIQUE `unique_index`(`user`, `email`, `address`);
1284
jonstjohn

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 autorise plusieurs lignes NULL de id_box_elements et id_router. 

J'utilise MySQL 5.1.42, donc il y a probablement eu des mises à jour sur le problème évoqué ci-dessus. Heureusement, cela fonctionne et j'espère que cela restera ainsi.

204
Frodik

Les index uniques multi-colonnes ne fonctionnent pas dans MySQL si vous avez une valeur NULL dans la ligne, car MySQL considère NULL comme une valeur unique et au moins n’a actuellement aucune logique pour la contourner dans les index multi-colonnes. Oui, le comportement est insensé, car il limite beaucoup d'applications légitimes d'index multi-colonnes, mais c'est ce qu'il est ... Pour l'instant, c'est un bogue qui a été marqué avec "ne résoudra pas" sur MySQL bug-track ...

44
niksoft

Avez-vous essayé cela? 

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

Cela fonctionne pour mysql version 5.5.32

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

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

Accédez à la page structure de votre table cible. Ajoutez un index unique à l'une des colonnes. Développez la liste Indexes au bas de la page de structure pour afficher l'index unique que vous venez d'ajouter. Cliquez sur l'icône d'édition et dans la boîte de dialogue suivante, vous pouvez ajouter des colonnes supplémentaires à cet index unique.

6
Vince K

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

  • vous pouvez définir des contraintes uniques impliquant des colonnes nullables. Supposons que vous définissiez 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 A!)
  • vous ne pouvez avoir qu'une seule paire (A, pas null B)

Exemple: PRODUCT_NAME, PRODUCT_VERSION 'Glass', null 'Glass', null 'Wine', 1

Maintenant, si vous essayez d'insérer à nouveau ('vin' 1), une violation de contrainte sera signalée J'espère que cela vous aidera

5
Cristian Botiza

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.

2
LXXIII

Pour ajouter un index unique, les éléments suivants sont requis:

1) nom_table
2) nom_index
3) colonnes sur lesquelles vous souhaitez ajouter 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 <votesuniqueindex>;(`user` ,`email`,`address`);
1
sandeep vanama

Si vous voulez éviter les doublons à l'avenir. Créez une autre colonne, dites id2. 

UPDATE tablename SET id2 = id;

Ajoutez maintenant l'unique sur deux colonnes:

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

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