当前位置: 首页 > 面试题库 >

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

督冠玉
2023-03-14
问题内容

我在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和并具有多对一关系onupdate=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给新的主键吗?


问题答案:

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

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



 类似资料:
  • 问题内容: 尝试在数据库中插入值时,mysql表出现问题。 我遵循了本教程 http://sqllessons.com/categories.html 并像教程中的表格一样创建表格 表格代码 错误的 SQL查询:编辑编辑 帮我解决这个问题。 问题答案: 声明要自动递增的值,不要插入它。所以: 接着:

  • 问题内容: 所以我的MySQL数据库表现得有些奇怪。这是我的桌子: 当我尝试插入表时出现此#1062错误。因此,我进一步研究了它,并意识到当我尝试在名称和共享值相同的表中插入值时,它将返回#1062错误。例如,如果我插入: 它将返回错误。但是,如果我将共享数更改为6,它将运行正常。是因为我的专栏之一可能是唯一的,还是仅与mysql有关? 问题答案: 您需要删除作为OR

  • 问题内容: 在通过MySQL数据库使用hibernate和jpa的Spring MVC应用程序中,每当我尝试保存包括子实体的父实体时,都会收到有关子实体的以下错误消息: 在这里,并引用子实体的组合主键的两个部分。 如何解决此错误? 在父实体中定义实体之间的关系的方法如下: 这是在子实体中定义关系的方式: 单击此链接可以查看完整的堆栈跟踪。可以在此链接上找到实体 的完整代码。 可以在此链接上读取实体

  • 我的数据库中有这些(简化的)表 我已经用这两个(简化的)类映射了表 公司 如果我注释第26、28、30和32行(上面标记的),同样的代码可以完美地工作。但我想知道为什么会产生异常。为什么是复制的钥匙? 提前谢了。

  • 问题内容: 尝试以下操作时,我在此错误消息上遇到了问题: 错误代码:1062。键“ PRIMARY”的条目“ 1”重复 我没有auto_increment数据,请帮助我! 这是与表格相关的, UFFICIO-INFORMAZIONI 插入 问题答案: 该 主 为什么已经产生错误的原因是因为已经有一个现有值的列在其中将其定义为( 值是唯一 在要插入的表格)。 为什么不将列设置为? 当您插入记录时,您

  • 问题内容: 首先,我已经看到许多其他这样的帖子,但是答案不适用于我的特殊情况。以防万一我几个月才学习SQL,对此我没有太多的了解。 这里有张桌子: 如我们所见,先前的值在表中出错了。应该是16个数字,而不仅仅是10个,实际上是不同的数字。 当我尝试插入新值时: 如果bank_card是AUTO_INCREMENT,为什么会有错误?我可以将PK更改到另一个地方吗? 非常感谢任何帮助 问题答案: 的最