MySQL的1062 - 重复重点“主要”入口“0”(MySQL 1062 - Duplicate

2019-06-17 22:41发布

我下表在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=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 - 重复条目“0”键“PRIMARY”

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

编辑:通过查看数据,我得到了新创建的列的值是“0”吧。 也许这是不允许变动,由于重复记录的主键(在新的主键)

我有8000个多行,所以我不能手动更改它。 有没有什么办法来分配rowid到一个新的主键?

Answer 1:

在运行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 

希望帮助。 如果您收到任何错误,请参考表&你得到错误代码(S)的结构编辑的问题。



Answer 2:

你需要指定主键自动递增

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

主键是一个独特的指数,因此,如果它包含重复,你不能指定列是唯一索引,所以你可能需要创建一个全新的列



Answer 3:

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



Answer 4:

这一步工作完美的我..你可以试试

  1. 添加索引
  2. 添加自动增量
  3. 添加主键

希望它能为你工作了。 祝好运



Answer 5:

设置主键为AUTO_INCREMENT。



文章来源: MySQL 1062 - Duplicate entry '0' for key 'PRIMARY'
标签: mysql sql mysql5