簡體   English   中英

使用MySQL(和PHP)有效地插入/更新多行的不同列

[英]Efficiently insert/update varying columns of multiple rows with MySQL (and PHP)

通常,當我需要插入/更新多行時,我將在PHP中生成如下語句:

INSERT INTO Products (ProductID, Name, Weight, Color) VALUES 
(1001, "Product A", 14.5, "Red"),
(1002, "Product B", 12.3, "Green"),
(null, "Product C", 15.3, "Yellow"),
...
(null, "Product Z", 10.4, "Blue")
ON DUPLICATE KEY UPDATE 
    Name = VALUES(Name), 
    Weight = VALUES(Weight), 
    Color = Values(Color)

(表Products僅在ProductID上有一個鍵,但是列的數量比此處要更新的列多。)

我使用這種查詢,是因為可以通過迭代要插入/更新的產品集來生成它來插入/更新任意數量的產品。

但是,問題在於某些值不應該更新。

如果可能的話,我想生成一個查詢,該查詢僅在每行的基礎上更新某些列:

INSERT INTO Products (ProductID, Name, Weight, Color) VALUES 
(1001, "Product A", DO_NOT_UPDATE, "Red"),
(1002, "Product B", 12.3, DO_NOT_UPDATE),
(null, "Product C", 15.3, "Yellow"),
...
(null, "Product Z", 10.4, "Blue")
ON DUPLICATE KEY UPDATE 
    Name = VALUES(Name), 
    Weight = VALUES(Weight), 
    Color = Values(Color)

我可以想到三種選擇:

  1. 生成多個查詢,這些查詢一次插入/更新一行。

  2. 生成多個查詢,一次更新一個(非id)列。 首先,您將不得不單獨執行插入語句,使用mysql_insert_id()添加ID,然后每列執行一次更新查詢,僅包括需要更新特定列的元素。 通常,您最終會得到與列數一樣多的查詢(除非您很幸運,列中有一些重疊而不更新)。

  3. 對於不需要更新的值,請首先在SELECT查詢中獲取現有值,然后只需生成INSERT ... ON DUPLICATE KEY UPDATE查詢即可,如本文頂部所示。

據我從mysql“重復鍵”文檔中了解到的 ,沒有辦法逐行忽略一個值。 (顯然,使用NULL只是將該行的值設置為NULL 。)我缺少什么嗎?

關於這些方法中哪種方法最有效的想法,特別是在行數> 50且列數為5-10的情況下? 同樣,對於每行只有1-2列要更新的情況,盡管要更新的列在所有列中隨行而異。

謝謝。

如果您不需要NULL作為字段的有效值,則可以執行以下操作:

INSERT INTO Products (ProductID, Name, Weight, Color) VALUES 
(1001, "Product A", NULL, "Red"),
(1002, "Product B", 12.3, NULL),
(null, "Product C", 15.3, "Yellow")
ON DUPLICATE KEY UPDATE 
    Name = IF(VALUES(Name) IS NULL, Name, VALUES(Name)), 
    Weight = IF(VALUES(Weight) IS NULL, Weight, VALUES(Weight)), 
    Color = IF(VALUES(Color) IS NULL, Color, VALUES(Color));

因此,如果您傳遞NULLUPDATE會將字段的值設置為其自身(從而有效地忽略了該操作)。 否則,該字段將更新為新值。

如果確實需要NULL ,則選擇另一個標志值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM