Mysql
SELECT 和 UPDATE 在單個查詢中,同時僅更新重複記錄的選擇性欄位
我有一個名為 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) ;