Mysql

INSERT ON DUPLICATE KEY UPDATE 以在單個查詢中更新多行

  • February 8, 2020

我遇到過有人建議使用單個查詢來使用多行ON DUPLICATE KEY UPDATEUPDATE不幸的是,似乎沒有人使用乾淨的 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);

引用自:https://dba.stackexchange.com/questions/258914