【问题标题】:MySQL strange error in CREATE ... SELECT: ERROR 1062 (23000): Duplicate entry '0' for key 1CREATE 中的 MySQL 奇怪错误 ... SELECT: ERROR 1062 (23000): Duplicate entry '0' for key 1
【发布时间】:2010-11-29 13:23:36
【问题描述】:

这是有问题的查询(其预期含义:将与实体 530 配对的所有实体拉到一个新表中,并包含对的计数):

CREATE TEMPORARY TABLE paired (
  entity_id INTEGER PRIMARY KEY,
  numrels INTEGER
)
SELECT I.entity2_id, COUNT(I.relation_id) AS numrels
FROM pairs I
WHERE I.entity1_id = 530 AND I.entity2_id IS NOT NULL
GROUP BY I.entity2_id
;

我解释错误信息:

ERROR 1062 (23000): Duplicate entry '0' for key 1

抱怨我违反了主键的唯一性。但是,我按该值分组,这应该确保唯一性,对吗?然后我想试试这个:

CREATE TEMPORARY TABLE paired (
  entity_id INTEGER PRIMARY KEY,
  numrels INTEGER
)
;
INSERT INTO paired
SELECT I.entity2_id, COUNT(I.relation_id) AS numrels
FROM pairs I
WHERE I.entity1_id = 530 AND I.entity2_id IS NOT NULL
GROUP BY I.entity2_id
;

令人惊讶的是,这没有任何问题,尽管根据我的理解,两者应该是等价的。

什么给了?!?

供参考:

mysql  Ver 14.12 Distrib 5.0.82sp1, for redhat-linux-gnu (x86_64) using readline 5.1

【问题讨论】:

  • 你得到的 id 值是唯一的吗?你能发布一些示例数据吗?

标签: mysql mysql-error-1062


【解决方案1】:

您的陈述并不相同。 CREATE ... SELECT 创建您在语句的 CREATE 部分中提到的列(即 entity_id 和 numrels),此外还为语句的 SELECT 部分的每一列创建列。您最终在新表中有四列。 SELECT 的结果被插入到最后两列。其他列填充了它们的默认值,这会导致违反主键的唯一性。

另见http://dev.mysql.com/doc/refman/5.0/en/create-table-select.html

【讨论】:

  • 谢谢!不太正确,但足够正确,我明白发生了什么。更准确地说:我有另一个类似的查询,并且那个有效。原因是,之前的查询在SELECTCREATE 中都有entity_id;在这个,我有entity2_id。如果列名相同,则将它们混为一谈。因此,我在其中有两列,但在这一列中有三列(entity_idnumrelsentity2_id)。 :D
猜你喜欢
  • 2013-09-09
  • 2021-10-07
  • 1970-01-01
  • 2011-10-29
  • 1970-01-01
  • 2017-06-22
  • 2021-01-22
  • 1970-01-01
  • 2018-09-17
相关资源
最近更新 更多