【问题标题】:MySQL batch update statement with different valuesMySQL批量更新语句具有不同的值
【发布时间】:2012-01-02 16:15:19
【问题描述】:

是否有任何单个与这些等效的SQL语句?

UPDATE table_name SET (a = 'something', b='B1') WHERE id=1;
UPDATE table_name SET (a = 'something else', b='B2') WHERE id=2;
UPDATE table_name SET (a = 'another', b='B3') WHERE id=3;

【问题讨论】:

  • 执行三个单独的语句有什么问题?除非您发现服务器的延迟特别高,否则这应该不是问题。

标签: mysql sql sql-update


【解决方案1】:

是的,这个:

UPDATE table_name
   SET a = CASE WHEN id = 1
                THEN 'something'
                WHEN id = 2
                THEN 'something else'
                WHEN id = 3
                THEN 'another'
           END
 WHERE id IN (1,2,3)
;

但我不确定这是否是您的想法?

【讨论】:

  • 谢谢,多个字段怎么样(见编辑的问题),我们可以在 CASE 块中包装字段还是需要为每个字段编写不同的 CASE 块?我的查询将更新 5 个字段。再次感谢。
  • OP 也想更新 b,你需要第二个 CASE
  • 您的 5 个字段需要 5 个 CASE 语句。
  • @MoeSweet:您需要单独的 CASE 表达式,因为 MySQL 不支持 SET (a, b) = (...) 语法并且不支持返回多个值的 CASE 表达式。
【解决方案2】:

如果您要插入更大的数据数组,那么您可以使用ON DUPLICATE KEY UPDATE 构造。它将在 MySQL 中更有效地工作。

有关类似问题,请参阅my answer here,以获取用法示例。

【讨论】:

    【解决方案3】:

    您可以使用具有常量值的选择行,然后将其与您的表连接。

    UPDATE table_name T INNER JOIN (select 1 as id,'something' as a,'B1' as b
    union all select 2,'something','B2'
    union all select 3,'another','B2') V on T.id = V.id set T.a = V.a, T.b = V.b;
    

    参考How to select multiple rows filled with constants?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多