Mysql

SELECT 和 UPDATE 在單個查詢中,同時僅更新重複記錄的選擇性欄位

  • May 2, 2015

我有一個名為 Contacts_table 的 MySQL 表,其中包含以下內容:

ID          NUMBER          NAME            CITY
001         2222222222      John Doe        Los Angeles
002         3333333333      Rich Malfoy     Houston
003         4444444444      Harry Potter    New York
004         5555555555      Billy Bones     Boston
005         6666666666      Joe Sanders     Chicago

*ID:主鍵;自動遞增

*NUMBER:唯一鍵

我正在使用 PHP 讀取這些欄位的值的逗號分隔文本轉儲,解析這些值並將它們添加到表中。比如說,一個範例文本轉儲具有以下內容(為清楚起見,此處顯示為表格):

NUMBER          NAME            CITY
1234567892      Earl Grey       Salem
3333333333      Rich Malfoy     Sacramento
7656453248      Bill Gates      New York
5555555555      James McGill    Boston
6666666666      NULL            Baton Rouge

現在,如您所見,我的 TXT 中有一些條目(基於 NUMBER)在我的表中不存在,即第 2、第 4 和第 5 條記錄。然後還有其他人已經在表中具有相應的條目,但在其他欄位上可能具有不同的值。我希望我的程式碼執行的是更新新條目(在此範例中使用 NUMBER 值 3333333333、5555555555 和 6666666666)。至於其他條目,程式碼只會更新 TXT 轉儲具有非 NULL 值的那些欄位。因此,這就是更新後的表格的樣子:

ID          NUMBER          NAME            CITY
001         2222222222      John Doe        Los Angeles
002         3333333333      Rich Malfoy     Sacramento
003         4444444444      Harry Potter    New York
004         5555555555      James McGill    Boston
005         6666666666      Joe Sanders     Baton Rouge
006         1234567892      Earl Grey       Salem
007         7656453248      Bill Gates      New York

就像我說的,只要有一個現有條目,就必須檢​​查欄位的值,並且只有那些在相應 TXT 轉儲中具有非 NULL 值的記錄的欄位才會更新。

我有一大堆 INSERT ON DUPLICATE KEY UPDATE 查詢(基本上,TXT 轉儲中的每個條目一個),如果轉儲包含數百條記錄,這將是很多。有什麼方法可以建構單個查詢以在單個事務中處理此任務?

由於 上有一個unique約束/索引number,因此您可以使用ON DUPLICATE KEY UPDATE語法 - 可以將其結合使用,INSERT ... VALUES以便在一個語句中插入/更新所有行。使用函式null可以滿足新值不更新現有值的附加要求。COALESCE()例子:

INSERT INTO Contacts
   (number, name, city)
VALUES
   (1234567892, 'Earl Grey', 'Salem'),
   (3333333333, 'Rich Malfoy', 'Sacramento'),
   (7656453248, 'Bill Gates', 'New York'),
   (5555555555, 'James McGill', 'Boston'),
   (6666666666, NULL, 'Baton Rouge')
ON DUPLICATE KEY UPDATE
   name = COALESCE(VALUES(name), name),
   city = COALESCE(VALUES(city), city) ;

SQLfiddle進行測試

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