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:
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!
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.
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.
Faites unique_id
NULL
à 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
);
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.
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.