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?

31
demandé sur User that is not a user 2012-08-29 18:03:51

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.

15
répondu Félix Gagnon-Grenier 2017-08-17 16:08:15

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

48
répondu Miroslav 2012-08-29 15:13:01

vérifiez si votre champ avec la touche primaire est défini à auto increment

10
répondu RickPat 2016-01-05 20:14:06

cette étape fonctionne parfaitement pour moi.. vous pouvez l'essayer

  1. ajouter l'indexation
  2. Ajouter Autoincrement
  3. Ajouter La Touche Primaire

j'espère que cela fonctionne pour vous aussi. bonne chance

4
répondu Bill Tanthowi Jauhari 2017-11-27 09:14:58