Die*_*ego 16 mysql duplicates sql-update
我必须使用以下结构更新表:
CREATE TABLE `eav_entity_attribute` (
`entity_attribute_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'Entity Attribute Id',
`entity_type_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Entity Type Id',
`attribute_set_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Attribute Set Id',
`attribute_group_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Attribute Group Id',
`attribute_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT 'Attribute Id',
`sort_order` smallint(6) NOT NULL DEFAULT '0' COMMENT 'Sort Order',
PRIMARY KEY (`entity_attribute_id`),
UNIQUE KEY `UNQ_EAV_ENTITY_ATTRIBUTE_ATTRIBUTE_SET_ID_ATTRIBUTE_ID` (`attribute_set_id`,`attribute_id`),
UNIQUE KEY `UNQ_EAV_ENTITY_ATTRIBUTE_ATTRIBUTE_GROUP_ID_ATTRIBUTE_ID` (`attribute_group_id`,`attribute_id`),
KEY `IDX_EAV_ENTITY_ATTRIBUTE_ATTRIBUTE_SET_ID_SORT_ORDER` (`attribute_set_id`,`sort_order`),
KEY `IDX_EAV_ENTITY_ATTRIBUTE_ATTRIBUTE_ID` (`attribute_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Eav Entity Attributes'
Run Code Online (Sandbox Code Playgroud)
上表包含一行:
INSERT INTO `eav_entity_attribute`
(`entity_attribute_id`, `entity_type_id`, `attribute_set_id`, `attribute_group_id`, `attribute_id`, `sort_order`)
VALUES
(32758, 4, 224, 3423, 5171, 12)
Run Code Online (Sandbox Code Playgroud)
我正在运行一个自动导入过程,它将读取外部数据源并写入此表.
此导入运行多次,因此有时会多次导入相同的数据.在这种情况下,该过程只是用新的数据覆盖旧数据,即使新数据与旧数据相同.存在相同数据的条件使用ON DUPLICATE KEY UPDATE子句处理.这个工作几乎完美,除了这个特定的表.
在此表上,当过程尝试UPDATE时,我收到"Duplicate key"消息,我无法解释.我调试了代码,这是失败的查询(从INSERT..ON DUPLICATE KEY中提取):
UPDATE eav_entity_attribute
SET
`attribute_group_id` = 3423
,`attribute_id` = 5171
,`attribute_set_id` = 223
,`entity_type_id` = 4
,`sort_order` = 320
WHERE
(`attribute_group_id` = 3423) AND
(`attribute_id` = 5171)
Run Code Online (Sandbox Code Playgroud)
错误如下:
Error Code: 1062. Duplicate entry '3423-5171' for key 'UNQ_EAV_ENTITY_ATTRIBUTE_ATTRIBUTE_GROUP_ID_ATTRIBUTE_ID'
Run Code Online (Sandbox Code Playgroud)
我知道对3423-5171已经存在,但UPDATE将自己替换这些值,而不是创建一个新条目.我对这个问题的原因感到很困惑,任何建议都会非常受欢迎.谢谢.
更新 - 新发现
我得到了一些"灵感",我做了一个实验.我删除了涉及on (attribute_set_id,attribute_id)的唯一约束(注意,这不是错误中的那个),我运行了INSERT..ON DUPLICATE查询.它工作得很好.
我是一个猜想,但这就是我的想法:我试图写入表中的数据与两个约束发生冲突:
attribute_set_id,attribute_id)attribute_group_id,attribute_id)INSERT失败,可能是因为第一个约束引起的重复错误.这会触发UPDATE,它使用第一个约束作为隐式WHERE子句.我的推测是,在这种情况下,第一个约束以某种方式被忽略,但UPDATE跳过第二个约束,之前没有涉及到.
对我来说,这仍然不是UPDATE的有效原因,它可以替换自身以引发重复的输入错误,但它可能会对其背后的逻辑有所了解.
第二次更新
我发现我正在测试的表实际上包含很多行(我忘了禁用过滤后的视图),这是因为成功导入了其他数据.但是,"复制候选人"在集合中仍然是唯一的.
我确认注释中发布的内容,当表只包含那些行时,INSERT..ON DUPLICATE工作,以及单独更新.现在我想知道为什么当表中有更多数据时表格搞砸了,因为我们仍在讨论使用相同数据更新的单个唯一行.
第三次更新 - 找到根本原因
我终于找到了UPDATE失败的原因,现在我必须找出如何处理这种情况.
线索是我在第一次更新中的推测.简单地说,我有两个非常相似的行(请注意我从一个干净的数据库开始使用不同的值).
row,entity_attribute_id,entity_type_id,attribute_set_id,attribute_group_id,attribute_id,sort_order
1,16919, 4, 120, 1746, 80, 1
2,16649, 4, 119, 1744, 80, 210
Run Code Online (Sandbox Code Playgroud)
这是发生的事情:
120, 4, 1744, 80, 54.120, 80对于字段attribute_set_id, attribute_id(第1行)是重复的.MySQL然后尝试UPDATE,如下所示:
UPDATE table
entity_type_id= 4,attribute_group_id= 1744,sort_order= 54 WHERE(attribute_set_id= 120)AND(attribute_id= 80)
这次,UPDATE失败,因为值1744,80违反了对中的约束attribute_group_id, attribute_id,在第2行中找到.
综上所述
attribute_set_id, attribute_id.attribute_group_id, attribute_id.解
我将不得不审查整个进口程序,因为理论上不应出现这样的重复.MySQL正在完成它的工作,它是复杂的数据库.
感谢所有的建议.
UPDATE尽量不要更新子句中的键值INSERT ... ON DUPLICATE KEY UPDATE。如果具有这些键值的记录已经存在,那么要求 MySQL 更改键值是很奇怪的,因此,MySQL 的意外行为并不奇怪。