【问题标题】:MySQL Error: Duplicate entry 'xxx' for Primary KeyMySQL 错误:主键的重复条目“xxx”
【发布时间】: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 的一个字段。

标签: mysql composite-primary-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级触发器的问题。问题解决了。谢谢。
猜你喜欢
  • 2019-02-23
  • 2018-05-01
  • 2012-08-18
  • 1970-01-01
  • 2018-05-02
  • 2014-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多