MySQL 1062-Duplicate entry "0" for key "PRIMARY"
j'ai le tableau suivant en version de MySQL 5.5.24
DROP TABLE IF EXISTS `momento_distribution`;
CREATE TABLE IF NOT EXISTS `momento_distribution`
(
`momento_id` INT(11) NOT NULL,
`momento_idmember` INT(11) NOT NULL,
`created_at` DATETIME DEFAULT NULL,
`updated_at` DATETIME DEFAULT NULL,
`unread` TINYINT(1) DEFAULT '1',
`accepted` VARCHAR(10) NOT NULL DEFAULT 'pending',
`ext_member` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`momento_id`, `momento_idmember`),
KEY `momento_distribution_FI_2` (`momento_idmember`),
KEY `accepted` (`accepted`, `ext_member`)
)
ENGINE=InnoDB
DEFAULT CHARSET=latin1;
il y a beaucoup de données avec des relations de plusieurs à un avec deux autres tables avec ondelete=restrict
et onupdate=restrict
.
maintenant, je dois changer la structure et introduire une clé primaire séparée dans le tableau, tout en conservant les relations et les données existantes. Pour cela, j'ai exécuté la requête suivante:
ALTER TABLE `momento_distribution` ADD `id` INT( 11 ) NOT NULL FIRST;
ALTER TABLE `momento_distribution` DROP PRIMARY KEY , ADD PRIMARY KEY ( `id` );
Malheureusement, mon deuxième requête a échoué avec l'erreur suivante:
1062-Duplicate entry '0' for key 'PRIMARY'
quelqu'un Peut s'il vous plaît signaler le problème? Je suppose que le problème est la relation existante, mais je ne veux pas perdre la relation ou les données existantes, qui ont plusieurs milliers de lignes. Est-il possible de le faire sans perdre de données?
EDIT: En regardant les données, j'ai obtenu que la colonne nouvellement créée a la valeur ' 0 ' en elle. Probablement cela ne permet pas de changer la clé primaire en raison de dupliquer enregistrements (en Nouvelle clé primaire)
j'ai plus de 8000 lignes, donc je ne peux pas le changer manuellement. Est-il possible d'attribuer rowid
à une nouvelle clé primaire?
4 réponses
exécutez la requête suivante dans la console mysql:
SHOW CREATE TABLE momento_distribution
Vérifiez la ligne qui ressemble à quelque chose
CONSTRAINT `momento_distribution_FK_1` FOREIGN KEY (`momento_id`) REFERENCES `momento` (`id`)
il se peut que ce soit différent, je mets juste une conjecture quant à ce que cela pourrait être. Si vous avez un clé étrangère sur "momento_id" et "momento_idmember", vous obtiendrez deux noms de clés étrangères. La prochaine étape consiste à supprimer les clés étrangères. Exécutez les requêtes suivantes:
ALTER TABLE momento_distribution DROP FOREIGN KEY momento_distribution_FK_1
ALTER TABLE momento_distribution DROP FOREIGN KEY momento_distribution_FK_2
assurez-vous de changer le nom de clé étrangère à ce que vous avez à partir de la CREATE TABLE
requête. Maintenant, vous n'avez plus de clés étrangères, vous pouvez donc facilement enlever le clé primaire. Essayez ce qui suit:
ALTER TABLE `momento_distribution` DROP PRIMARY KEY
Ajouter la colonne comme suit:
ALTER TABLE `momento_distribution` ADD `id` INT( 11 ) NOT NULL PRIMARY KEY AUTO_INCREMENT FIRST
cette requête ajoute aussi des nombres pour que vous n'ayez pas besoin de dépendre de @rowid. Maintenant, vous devez ajouter la clé étrangère dans les colonnes antérieures. Pour cela, la première rendre ces index:
ALTER TABLE `momento_distribution` ADD INDEX ( `momento_id` )
ALTER TABLE `momento_distribution` ADD INDEX ( `momento_idmember` )
Maintenant, ajoutez les clés étrangères. Modifier la Table/colonne de référence au fur et à mesure besoin de:
ALTER TABLE `momento_distribution` ADD FOREIGN KEY ( `momento_id`) REFERENCES `momento` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
ALTER TABLE `momento_distribution` ADD FOREIGN KEY ( `momento_idmember`) REFERENCES `member` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
j'Espère que vous aide. Si vous avez des erreurs, veuillez modifier la question avec la structure des tableaux de référence et le(S) code (s) d'erreur que vous obtenez.
Vous devez indiquer la clé primaire auto-incrémentée
CREATE TABLE `momento_distribution`
(
`momento_id` INT(11) NOT NULL AUTO_INCREMENT,
`momento_idmember` INT(11) NOT NULL,
`created_at` DATETIME DEFAULT NULL,
`updated_at` DATETIME DEFAULT NULL,
`unread` TINYINT(1) DEFAULT '1',
`accepted` VARCHAR(10) NOT NULL DEFAULT 'pending',
`ext_member` VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (`momento_id`, `momento_idmember`),
KEY `momento_distribution_FI_2` (`momento_idmember`),
KEY `accepted` (`accepted`, `ext_member`)
)
ENGINE=InnoDB
DEFAULT CHARSET=latin1$$
ALTER TABLE `momento_distribution`
CHANGE COLUMN `id` `id` INT(11) NOT NULL AUTO_INCREMENT,
DROP PRIMARY KEY,
ADD PRIMARY KEY (`id`);
une clé primaire est un index unique, donc si elle contient des doublons, vous ne pouvez pas assigner la colonne à un index unique, donc vous pourriez avoir besoin de créer une nouvelle colonne tout à fait
vérifiez si votre champ avec la touche primaire est défini à auto increment
cette étape fonctionne parfaitement pour moi.. vous pouvez l'essayer
- ajouter l'indexation
- Ajouter Autoincrement
- Ajouter La Touche Primaire
j'espère que cela fonctionne pour vous aussi. bonne chance