MySQL - Rendre un champ existant unique


155

J'ai une table déjà existante avec un champ qui devrait être unique mais qui ne l'est pas. Je le sais seulement parce qu'une entrée a été faite dans la table qui avait la même valeur qu'une autre entrée déjà existante et cela a causé des problèmes.

Comment faire en sorte que ce champ n'accepte que des valeurs uniques?

Réponses:


293
ALTER IGNORE TABLE mytbl ADD UNIQUE (columnName);

Pour MySQL 5.7.4 ou version ultérieure:

ALTER TABLE mytbl ADD UNIQUE (columnName);

Depuis MySQL 5.7.4, la clause IGNORE pour ALTER TABLE est supprimée et son utilisation produit une erreur.

Assurez-vous donc de supprimer d'abord les entrées en double car le mot clé IGNORE n'est plus pris en charge.

Référence


62
+1 If IGNORE is specified, only the first row is used of rows with duplicates on a unique key, The other conflicting rows are deleted. Docs
The Scrum Meister

1
Existe-t-il un moyen de lui dire de supprimer des lignes en fonction de certains critères? Ou auriez-vous besoin de faire un pré-traitement avant de le ALTERfaire.
corsiKa

7
ALTER IGNOREpeut toujours donner une erreur en double sur MySQL version> 5.5 et sur InnoDB pour la sécurité de vos données. Si vous êtes simplement sûr que conserver la première des lignes dupliquées est la bonne chose, essayez set session old_alter_table=1. N'oubliez pas de le remettre en place. mysqlolyk.wordpress.com/2012/02/18/…
michaelliu

2
Pour quiconque tombe sur cela en utilisant la version 5.6.7 ou supérieure, IGNORE n'est plus pris en charge. moredocs Je suppose que la façon de le faire maintenant est de s'assurer que vous n'avez pas de doublons d'abord, non?
William T.Mallard

1
Veillez à effectuer une copie de sauvegarde de la table avant d'exécuter cette requête. Il supprimera toutes les lignes sauf la première si le nom de la colonne a les mêmes valeurs ou est vide.
stabil_daddy

34

Écrivez simplement cette requête dans votre db phpmyadmin.

ALTER TABLE TableName ADD UNIQUE (FieldName)

Par exemple: ALTER TABLE user ADD UNIQUE (email)


16

Si vous souhaitez également nommer la contrainte, utilisez ceci:

ALTER TABLE myTable
  ADD CONSTRAINT constraintName 
    UNIQUE (columnName);

7

CREATE UNIQUE INDEX foo ON table_name (field_name)

Vous devez supprimer les valeurs en double sur cette colonne avant d'exécuter ce sql. Toute valeur en double existante sur cette colonne vous mènera à l' erreur MySQL 1062


4

Le moyen le plus simple et le plus rapide serait d'utiliser la table de structure phpmyadmin.

UTILISEZ LE PANNEAU ADMIN PHPMYADMIN!

Là, c'est en russe, mais en anglais, la version devrait être la même. Cliquez simplement sur le bouton Unique. Aussi à partir de là, vous pouvez rendre vos colonnes PRIMAIRE ou SUPPRIMER.


2
ALTER IGNORE TABLE mytbl ADD UNIQUE (columnName);

est la bonne réponse

la pièce d'insertion

INSERT IGNORE INTO mytable ....

1

Ce code est de résoudre notre problème pour définir une clé unique pour la table existante

alter ignore table ioni_groups add unique (group_name);

Mais supprime tous les doublons, y compris ceux en dehors des colonnes
Biasi Wiga
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.