MySQL 错误:主键的重复条目“xxx”

Posted

技术标签:

【中文标题】MySQL 错误:主键的重复条目“xxx”【英文标题】:MySQL Error: Duplicate entry 'xxx' for Primary Key 【发布时间】:2017-02-17 07:57:05 【问题描述】:

我有一个主键由 2 个字段组成的表 mysql,如下所示

表中已经存在的记录是:

我发出的 INSERT 查询是:

当我运行查询时:

INSERT INTO `case_data` 
VALUES ('WCD/2016/1000017', 2, '2016-09-29', 'WCD',***********************

显示的错误信息是:

[Err] 1062 - 键“PRIMARY”的重复条目“WCD/2016/1000017”

我是否违反了主键约束?

提前致谢。

【问题讨论】:

您只能在主键列中添加唯一字符串。此处“WCD/2016/1000017”已存在于表中,因此您不能在表中为主键列添加相同的字符串。 是的,你违反了主键约束。 @Vivek:如果我要将值 'WCD/2016/1000017' 更改为其他值,我为什么需要使用复合键? 您可以使用自动递增的多列“id”。这可能会解决您的问题。 同意。但是手动增加 'Iteration' 字段有什么问题呢?这就是 Composite Key 的概念:您可以保持 Key 的所有字段相同,而只更改 key 的一个字段。 【参考方案1】:

您可以检查您尝试插入的行的主键值是否已存在于表中:

SELECT COUNT(*)
FROM case_data
WHERE caseno = 'WCD/2016/1000017' AND iteration = 2;

如果它返回0,那么您将不会违反 PK 约束并且可以安全地插入您希望的行(假设没有额外的检查、触发器、约束)。否则它将返回1,这意味着您已经有一行包含这些列中的值,因此您将违反不允许的行的唯一性。

当它返回0 时,只需发出INSERT 命令。另外,请记住在语句中指定列表,以确保 VALUES 中的每个值都放在目标表的右列中:

INSERT INTO case_data (caseno, iteration, casedate, casetype)
VALUES ('WCD/2016/1000017', 2, '2016-09-29', 'WCD');

如果列名和表名不包含逗号或空格等替代字符,请避免在它们周围使用反引号。这将使您的代码更具可读性,并且肯定会加快您的编写时间。

【讨论】:

我尝试了您建议的 SELECT 查询,它返回 0。但我仍然无法使用上述 INSERT 查询插入一行。 一定有其他东西阻止您执行 INSERT 恕我直言。检查这个:sqlfiddle.com/#!9/aa8ec 我单击了第一个框下方的“构建架构”,然后单击了第二个框下方的“运行 SQL”。第二个盒子里什么都没有。抱歉,我从未使用过 SQL Fiddle 网站。 好吧,它发出了 CREATE TABLE 和 INSERT 语句。在第二个框中您可以输入SELECT * FROM case_data 以查看一切正常,并且插入时没有错误 卡米尔。你是对的。 3级触发器的问题。问题解决了。谢谢。

以上是关于MySQL 错误:主键的重复条目“xxx”的主要内容,如果未能解决你的问题,请参考以下文章

MySQL上主键的重复条目

Mysql主键的重复条目(AUTO_INCREMENT)

如何避免没有主键和唯一键的重复条目?

IntegrityError:(1062,键的重复条目)

MySQL PHPMyAdmin 错误 #1062 - 键 'PRIMARY' 的重复条目 '0'

如何处理重复条目的错误?