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”的主要内容,如果未能解决你的问题,请参考以下文章