【问题标题】:MySQL 1062 - Duplicate entry '0' for key 'PRIMARY'MySQL 1062 - 键 'PRIMARY' 的重复条目 '0'
【发布时间】:2012-08-24 04:07:15
【问题描述】:

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

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

编辑: 通过查看数据,我得知新创建的列中包含值“0”。由于重复记录(在新主键中),这可能不允许更改主键

我有超过 8,000 行,因此无法手动更改。有没有办法将rowid 分配给新的主键?

【问题讨论】:

  • 您的编辑解释说您的默认值为 0 帮助了我。好像在我的情况下,我的表是在添加 auto_increment 之前创建的(没有 id,默认为 0)
  • 我曾经有同样的错误。就我而言,问题在于我正在管理一个非空表。我通过做 TRUNCATE TABLE name_table 解决了,然后我能够添加主键

标签: mysql sql mysql5


【解决方案1】:

你需要指定主键为自增

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 是唯一索引,因此如果它包含重复项,则不能将该列指定为唯一索引,因此您可能需要完全创建一个新列

【讨论】:

  • 感谢 Merca,但我给出了上面的查询作为对表结构的参考。我没有创建新表。我已经有很多行的表,所以只有 alter query 是选项。目前 momento_id 和 momento_idmember 是外键和复合键。我需要将它们作为主键删除并引入新列作为主键。
  • 抱歉,编辑也不起作用。 momento_idmomento_idmember 已经是主键。我需要新列作为主键。检查我的帖子,我已经使用查询 ALTER TABLE momento_distribution ADD id INT(11) NOT NULL FIRST; 成功添加了列。现在需要将其设为主要。
  • PRIMARY KEY 是唯一索引,所以如果它包含重复项,则不能将该列指定为唯一索引,因此您可能需要完全创建一个新列
  • 是的,这就是原因。请在最后检查有问题的编辑。 MySQL中有@rowid。试图将其分配为价值。有可能吗?
  • 谢谢。正在为此苦苦挣扎。真的很有帮助。
【解决方案2】:

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

SHOW CREATE TABLE momento_distribution

检查看起来像这样的行

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

可能会有所不同,我只是猜测可能是什么。如果您在“momento_id”和“momento_idmember”上都有foreign key,您将获得两个外键名称。下一步是删除外键。运行以下查询:

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

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

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 

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

【讨论】:

  • 谢谢@Youthpark,我正在尝试这些查询,最多在接下来的 10 分钟内返回。感谢帮助。我对这个问题感到非常沮丧。
  • 如果有任何问题,请提供所有表格的结构和错误代码。
  • 终于完成了。我从昨天开始就被困在那里。非常感谢。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    这一步非常适合我..你可以试试

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

    希望它也对你有用。祝你好运

    【讨论】:

    • 此方法的步骤或过程会有所帮助。
    【解决方案5】:

    将您的 PRIMARY KEY 设置为 AUTO_INCREMENT。

    【讨论】:

      【解决方案6】:

      对我来说,我忘记将 AUTO_INCREMENT 添加到我的主字段并插入没有 id 的数据。

      【讨论】:

        【解决方案7】:

        AUTO_INCREMENT 设置为 PRIMARY KEY

        【讨论】:

          【解决方案8】:

          我遇到了这个错误, 使用了 typeorm migrations Api,上面提到的这个错误是由于 id 没有自动递增, 所以如果你使用 typeorm 的 Api 迁移来编写迁移, 当您编写 id 列时,使用它来设置 id 列。 { name: "id", type: "int auto_increment", isPrimary: true }

          【讨论】:

            猜你喜欢
            • 2017-08-07
            • 2014-09-04
            • 2023-03-07
            • 2018-07-11
            • 2017-10-09
            • 1970-01-01
            • 1970-01-01
            • 2012-07-23
            相关资源
            最近更新 更多