ON DUPLICATE KEY UPDATE导致外键约束错误

时间:2012-11-03 18:39:11

标签: mysql foreign-keys duplicates constraints

我搜索了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 ;

1 个答案:

答案 0 :(得分: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)