1062 mysql dupicate 0,MySQL 1062-键“ PRIMARY”的条目“ 0”重复

I have the following table in MySQL version 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;

It has lots of data with many-to-one relations with two other tables with ondelete=restrict and onupdate=restrict.

Now, I need to change the structure and introduce separate primary key in the table, while still keeping existing relations and data. For that, I executed the following query:

ALTER TABLE `momento_distribution` ADD `id` INT( 11 ) NOT NULL FIRST;

ALTER TABLE `momento_distribution` DROP PRIMARY KEY , ADD PRIMARY KEY ( `id` );

Unfortunately, my second query failed with the following error:

1062 - Duplicate entry '0' for key 'PRIMARY'

Can someone please point out the issue? I guess that the issue is the existing relation, but I don't want to lose the existing relation or data, that has several thousand rows. Is there any way to do this without losing data?

EDIT:

By viewing data, I got that the newly created column has the value '0' in it. Probably this is not allowing to change the Primary Key due to duplicate records (in new Primary Key)

I have more than 8,000 rows, so I can't change it manually. Is there any way to assign rowid to a new Primary Key?

解决方案

Run the following query in the mysql console:

SHOW CREATE TABLE momento_distribution

Check for the line that looks something like

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

It may be different, I just put a guess as to what it could be. If you have a foreign key on both 'momento_id' & 'momento_idmember', you will get two foreign key names. The next step is to delete the foreign keys. Run the following queries:

ALTER TABLE momento_distribution DROP FOREIGN KEY momento_distribution_FK_1

ALTER TABLE momento_distribution DROP FOREIGN KEY momento_distribution_FK_2

Be sure to change the foreign key name to what you got from the CREATE TABLE query. Now you don't have any foreign keys so you can easily remove the primary key. Try the following:

ALTER TABLE `momento_distribution` DROP PRIMARY KEY

Add the required column as follows:

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

This query also adds numbers so you won't need to depend on @rowid. Now you need to add the foreign key back to the earlier columns. For that, first make these indexes:

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

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

Now add the foreign keys. Change the Reference Table/column as you need:

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

Hope that helps. If you get any errors, please edit the question with the structure of the reference tables & the error code(s) that you are getting.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值