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 ;
4

1 回答 1

6

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

问题是尝试使用插入进行更新时,您必须考虑插入的所有约束。任何未定义的值都必须具有默认值。我有一个“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)
于 2012-11-03T18:39:10.677 回答