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