Mysql
INSERT ON DUPLICATE KEY UPDATE 以在單個查詢中更新多行
我遇到過有人建議使用單個查詢來使用多行
ON DUPLICATE KEY UPDATE
。UPDATE
不幸的是,似乎沒有人使用乾淨的 SQL(定義一個明顯的主鍵id
並使用至少兩行),因此我無法確認效果令人滿意。假設表中的所有數據都存在並且某些
quantity
行會有所不同:INSERT INTO variations (id, name, quantity) VALUES (1, 'John', 4), (2, 'Amy', 5), (3, 'Elizabeth', 6) ON DUPLICATE KEY UPDATE id=VALUES(id), name=VALUES(name), quantity=VALUES(quantity);
如果表中的數量是 1、2 和 3,那麼我的構成是上面的查詢應該
UPDATE
是 4、5 和 6。但是手動執行命令返回Affected rows: 0
並且我的應用程序中的數據毫無疑問不會改變.說明:
- 這些
name
行的值可能會發生變化,我試圖保持程式碼簡單。- 是主
id
鍵,沒有其他鍵。- 如果查詢和表行之間所有行的所有數據都相同,則
UPDATE
不必發生。- 有時只有一列數據可能會更改,有時除此之外的所有列都
id
可能更改。- 關於
VALUES()
它是否使用$row
(例如來自 PHP)數據以及UPDATE
它是否與行中已有的數據不同,沒有任何說明。- 關於是否必須指定所有列(除了主鍵或唯一鍵)沒有說明。
- MariaDB 和 MySQL 的文件都留下了一個模糊的、神秘的未知雲。
- 我正在執行 MariaDB 10.2.6 (MySQL 5.5.5)。
我很想將程式碼轉儲到一個循環中以每行
UPDATE
執行一個查詢,因為我沒有時間從中創建一個巨大的項目。這里或 SO 中的現有執行緒都沒有正確解決多個 UPDATE 單查詢問題(使用看起來像可怕的噩夢來構造的範例),所以我希望得到一個可以毫無疑問地澄清這一點的答案,以便我可以從中學習令人沮喪的挑戰。case
感謝#danblack 和 dbfiddle.uk 簡而言之,我確定我錯過了
ON DUPLICATE KEY UPDATE
.必須定義每一列才能
ON DUPLICATE KEY UPDATE
工作!我有效地在表中有列
id
、、、和。我忘了定義其中一列(那不是要求的前半部分)。a``b``c``d``id
不起作用(缺少列):
ON DUPLICATE KEY UPDATE id=VALUES(id), a=VALUES(a), c=VALUES(c), d=VALUES(d);
將工作(具有所有表列):
ON DUPLICATE KEY UPDATE id=VALUES(id), a=VALUES(a), b=VALUES(b), c=VALUES(c), d=VALUES(d);