web-dev-qa-db-fra.com

# 1062 - Entrée en double '' pour la clé 'unique_id' lors de la tentative d'ajout de clé unique (MySQL)

J'ai une erreur sur MySQL en essayant d'ajouter une clé unique. Voici ce que j'essaie de faire. J'ai une colonne appelée 'unique_id' qui est VARCHAR (100). Il n'y a pas d'index défini sur la table. Je reçois cette erreur:

#1062 - Duplicate entry '' for key 'unique_id' 

Lorsque j'essaie d'ajouter une clé UNIQUE. Voici une capture d'écran de la façon dont je la configure dans phpMyAdmin:

enter image description here

Voici la requête MySQL générée par phpMyAdmin:

ALTER TABLE  `wind_archive` ADD  `unique_id` VARCHAR( 100 ) NOT NULL FIRST ,
ADD UNIQUE (
`unique_id`
)

J'ai eu ce problème dans le passé et je ne l'ai jamais résolu, alors je viens de reconstruire la table à partir de zéro. Malheureusement, dans ce cas, je ne peux pas le faire car il y a déjà beaucoup d'entrées dans la table. Merci de votre aide!

24
MillerMedia

L'erreur dit tout:

Duplicate entry '' 

Alors lancez la requête suivante:

SELECT unique_id,COUNT(unique_id)
FROM yourtblname
GROUP BY unique_id
HAVING COUNT(unique_id) >1

Cette requête vous montrera également le problème

SELECT *
FROM yourtblname
WHERE unique_id=''

Cela vous montrera où il y a des valeurs qui ont des doublons. Vous essayez de créer un index unique sur un champ avec des doublons. Vous devrez d'abord résoudre les données en double, puis ajouter l'index.

32
Namphibian

C'est la 3ème fois que je cherche une solution à ce problème, donc pour la référence, je poste la réponse ici.

En fonction des données, nous pouvons utiliser le mot clé IGNORE avec la commande Alter. Si IGNORE est spécifié, seule la première ligne est utilisée pour les lignes en double sur une clé unique. Les autres lignes en conflit sont supprimées. Les valeurs incorrectes sont tronquées à la valeur acceptable la plus proche.

L'extension du mot clé IGNORE de MySQL semble comporter un bogue dans la version InnoDB sur certaines versions de MySQL.

Vous pouvez toujours, convertir en MyISAM, IGNORE-ADD l'index puis reconvertir en InnoDB

ALTER TABLE table ENGINE MyISAM;
ALTER IGNORE TABLE table ADD UNIQUE INDEX dupidx (field);
ALTER TABLE table ENGINE InnoDB;

Notez que si vous avez des contraintes de clé étrangère, cela ne fonctionnera pas, vous devrez d'abord les supprimer, puis les rajouter ultérieurement.

13
RQube

Faites unique_idNULL à partir de NOT NULL et cela résoudra votre problème

select ID from wind_archive 
where ID not in (select max(ID) from wind_archive group by unique_id) 

et c’est ce que vous devez supprimer de la table avant d’ajouter avec succès la clé unique . Cela fonctionne également pour ajouter une clé unique avec 2 colonnes ou plus . comme. 

delete from wind_archive 
where ID in (
select * from (select ID from wind_archive where ID not in (
select max(ID) from wind_archive group by lastName, firstName
) ORDER BY ID
) AS p
);
1
Ning Yu Fisher

J'avais la même erreur (entrée en double '' pour la clé 'unique_id') lorsque j'essayais d'ajouter une nouvelle colonne comme unique "après". J'avais déjà créé un tableau contenant uniquement les noms des musées. Je voulais revenir en arrière et ajouter un code unique pour chaque nom de musée, avec l'intention d'insérer les valeurs de code une à la fois. Mauvaise planification de la part de ma part… .. Ma solution a été d’ajouter la nouvelle colonne sans la rendre unique; puis entré les données pour chaque code une ligne à la fois; puis en modifiant la structure de la colonne pour la rendre unique pour les entrées futures. Heureusement, il n'y avait que 10 rangées.

0
T. Bulford

parce que vous écrivez dans votre requête, unique_id sera NOT NULL et toutes les lignes précédentes sont nulles et vous voulez que cette colonne soit unique. Après avoir exécuté cette requête, vous avez plusieurs lignes de même valeur, cela signifie que cette colonne n'est pas unique alors vous devez changer unique_id NOT NULL en unique_id NULL dans votre requête. 

0
a.miadian