繁体   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