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 に答える