MySQL 1062 – 重复键入'PRIMARY'的条目'0'

我在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; 

它具有许多与其他两个表具有ondelete=restrict关系的数据, ondelete=restrictonupdate=restrict

现在,我需要改变结构并在表中引入单独的主键,同时仍然保留现有的关系和数据。 为此,我执行了以下查询:

 ALTER TABLE `momento_distribution` ADD `id` INT( 11 ) NOT NULL FIRST; ALTER TABLE `momento_distribution` DROP PRIMARY KEY , ADD PRIMARY KEY ( `id` ); 

不幸的是,我的第二个查询失败,出现以下错误:

1062 – 键“PRIMARY”重复input“0”

有人可以指出这个问题吗? 我想这个问题是现有的关系,但我不想丢失现有的关系或数据,有几千行。 有没有办法做到这一点,而不会丢失数据?

编辑:通过查看数据,我得到新创build的列中的值为'0'。 可能由于重复logging(在新的主键中),不允许更改主键

我有超过8000行,所以我不能手动改变它。 有没有办法将rowid分配给新的主键?

在mysql控制台中运行以下查询:

 SHOW CREATE TABLE momento_distribution 

检查看起来像这样的线

 CONSTRAINT `momento_distribution_FK_1` FOREIGN KEY (`momento_id`) REFERENCES `momento` (`id`) 

这可能是不同的,我只是猜测它可能是什么。 如果你在'momento_id'和'momento_idmember'上都有一个外键 ,你会得到两个外键名称。 下一步是删除外键。 运行以下查询:

 ALTER TABLE momento_distribution DROP FOREIGN KEY momento_distribution_FK_1 ALTER TABLE momento_distribution DROP FOREIGN KEY momento_distribution_FK_2 

确保将外键名称更改为您从CREATE TABLE查询中获得的名称。 现在你没有任何外键,所以你可以轻松地删除主键 。 尝试以下操作:

 ALTER TABLE `momento_distribution` DROP PRIMARY KEY 

添加所需的列如下:

 ALTER TABLE `momento_distribution` ADD `id` INT( 11 ) NOT NULL PRIMARY KEY AUTO_INCREMENT FIRST 

这个查询也增加了数字,所以你不需要依赖@rowid。 现在您需要将外键添加回较早的列。 为此,首先做这些索引:

 ALTER TABLE `momento_distribution` ADD INDEX ( `momento_id` ) ALTER TABLE `momento_distribution` ADD INDEX ( `momento_idmember` ) 

现在添加外键。 根据需要更改参考表/列:

 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 

希望有所帮助。 如果出现任何错误,请使用参考表的结构和错误代码编辑问题。

您需要将主键指定为自动递增

 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`); 

PRIMARY KEY是一个唯一的索引,所以如果它包含重复项,则不能将该列指定为唯一索引,因此您可能需要全部创build一个新列

检查您的主键字段是否设置为自动增量