2012-11-03 223 views
3

我搜索了StackOverflow,但我找不到我的具体问题的答案。重复密钥更新导致外键约束错误

最近,我已经成为一个更新记录与列表,使用“INSERT INTO ... ON DUPLICATE KEY UPDATE”的忠实粉丝。但是,我遇到以下查询问题:

INSERT INTO itens (prod_id, qtd) VALUES (410, 1),(442, -1) 
ON DUPLICATE KEY UPDATE qtd = qtd + VALUES(qtd) 

导致出现错误:“无法添加或更新子行:外键约束失败。”

这是所讨论的表格的结构。 “carrinho_id”是一个外键。我感到困惑的是,我并没有试图用外键做任何事情。我只是想更新数量。

CREATE TABLE IF NOT EXISTS `itens` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
`carrinho_id` int(10) unsigned NOT NULL DEFAULT '1', 
`prod_id` int(10) unsigned NOT NULL DEFAULT '1', 
`qtd` int(12) NOT NULL DEFAULT '0', 
PRIMARY KEY (`id`), 
KEY `carrinho_id` (`carrinho_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=229 ; 

回答

5

我找到了自己的问题的答案,并认为它可以帮助其他人在类似的情况。

问题是,试图使用插入更新,你必须考虑插入的所有约束条件。任何未定义的值都必须具有缺省值。我有一个'carrinho_id'的默认值,但是它的记录已经被删除了,因此我得到了这个错误。

原来,这不是我唯一的问题。为了让MySql检测到重复,你必须指定一个只能是唯一的行。由于我遗漏了'id',它只是添加了一个新行,从零开始减去数量值。同样重要的是要注意,只有在列未经签名的情况下,您才能以此方式减去数量。

最终,我成功通过同时指定主键和外键:

INSERT INTO itens (id, carrinho_id, prod_id, qtd) VALUES (225, 75, 410, 1),(226, 75, 442, -1) 
ON DUPLICATE KEY UPDATE qtd = qtd + VALUES(qtd) 
+0

指定所有键(主键和外)也奏效了我。谢谢! –