MySQL中的多个更新

我知道你可以一次插入多行,是否有办法在MySQL中一次更新多行(如在一个查询中)?

编辑:例如,我有以下

Name   id  Col1  Col2
Row1   1    6     1
Row2   2    2     3
Row3   3    9     5
Row4   4    16    8

我想将所有以下更新合并到一个查询中

UPDATE table SET Col1 = 1 WHERE id = 1;
UPDATE table SET Col1 = 2 WHERE id = 2;
UPDATE table SET Col2 = 3 WHERE id = 3;
UPDATE table SET Col1 = 10 WHERE id = 4;
UPDATE table SET Col2 = 12 WHERE id = 4;

是的,这是可能的 - 您可以使用INSERT ... ON DUPLICATE KEY UPDATE。

使用你的例子:

INSERT INTO table (id,Col1,Col2) VALUES (1,1,1),(2,2,3),(3,9,3),(4,10,12)
ON DUPLICATE KEY UPDATE Col1=VALUES(Col1),Col2=VALUES(Col2);

由于您具有动态值,因此需要使用IF或CASE来更新列。 它变得有点丑陋,但它应该工作。

使用你的例子,你可以这样做:

UPDATE table SET Col1 = CASE id 
                          WHEN 1 THEN 1 
                          WHEN 2 THEN 2 
                          WHEN 4 THEN 10 
                          ELSE Col1 
                        END, 
                 Col2 = CASE id 
                          WHEN 3 THEN 3 
                          WHEN 4 THEN 12 
                          ELSE Col2 
                        END
             WHERE id IN (1, 2, 3, 4);

这个问题很老,但我想用另一个答案来扩展这个话题。

我的观点是,实现它的最简单方法就是用事务包装多个查询。 接受的答案INSERT ... ON DUPLICATE KEY UPDATE是一个不错的破解,但应该意识到它的缺点和局限性:

  • 如前所述,如果您碰巧使用表中不存在主键的行启动查询,则该查询会插入新的“半成品”记录。 可能它不是你想要的
  • 如果你有一个非空字段没有默认值的表,并且不希望在查询中触及这个字段,你会得到"Field 'fieldname' doesn't have a default value"即使你不'根本不插入单行。 如果您决定严格并将mysql警告转化为应用程序中的运行时异常,它会让您陷入麻烦。
  • 我对三种建议的变体进行了一些性能测试,其中包括INSERT ... ON DUPLICATE KEY UPDATE变体,带有“case / when / then”子句的变体以及带有事务的幼稚方法。 你可能会在这里得到Python代码和结果。 总体结论是,带有case语句的变体的速度是其他两种变体的两倍,但为它编写正确和注入安全的代码非常困难,所以我个人坚持使用最简单的方法:使用事务。

    编辑: Dakusan的调查结果证明我的表现估计不是很有效。 请参阅另一个更详细的研究的答案。

    链接地址: http://www.djcxy.com/p/94287.html

    上一篇: Multiple Updates in MySQL

    下一篇: Filter or analyzer to equate English numbers and arabic numerals