MYSQL多次更新

Posted

技术标签:

【中文标题】MYSQL多次更新【英文标题】:MYSQL multiple updates 【发布时间】:2016-10-20 12:33:17 【问题描述】:

我想针对不同的情况一次更新表格的同一列。我可以实现这一目标的最佳方法是什么?例如,我想在一个 SQL 查询中实现与以下语句相同的事情:

UPDATE DANCER_TYPE SET TYPE = 'BALLET' WHERE LOGIN = 'arachel';
UPDATE DANCER_TYPE SET TYPE = 'EXOTIC_BELLY_DANCER' WHERE LOGIN = 'mandanah';
UPDATE DANCER_TYPE SET TYPE = 'JAZZ' WHERE LOGIN = 'kbianca';
UPDATE DANCER_TYPE SET TYPE = 'FUSION' WHERE LOGIN = 'lmorgan';
UPDATE DANCER_TYPE SET TYPE = 'BOLLYWOOD' WHERE LOGIN = 'idcruz';
UPDATE DANCER_TYPE SET TYPE = 'SAMBA' WHERE LOGIN = 'pcastillo';

使用单个查询以最可扩展和最有效的方式更新 DANCER_TYPE 列的最佳方法是什么?

【问题讨论】:

您要解决的问题是什么?您需要它只是一个声明的真正原因是什么? 【参考方案1】:
UPDATE DANCER_TYPE
   SET TYPE = CASE LOGIN 
                      WHEN 'arachel' THEN 'BALLET' 
                      WHEN 'mandanah' THEN 'EXOTIX_BELLY_DANCER' 
                      ELSE 'YOURELSEVALUE'
                   END;

应该适用于您的情况(仅做了 2 个示例)

【讨论】:

如果你不想在其他上做任何事情,只需使用:ELSE NULL 如果没有WHERE,这将扫描整个表更改每一行! @RickJames 不是 OP 想要的:自动为每个舞者分配类型【参考方案2】:

用例 - 表达式

UPDATE DANCER_TYPE 
SET TYPE = CASE WHEN LOGIN = 'arachel' THEN 'BALLET'  
                WHEN LOGIN = 'mandanah' THEN 'EXOTIC_BELLY_DANCER' 
                WHEN LOGIN = 'kbianca' THEN 'JAZZ' 
                WHEN LOGIN = 'lmorgan' THEN 'FUSION'  
                WHEN LOGIN = 'idcruz' THEN 'BOLLYWOOD' 
                WHEN LOGIN = 'pcastillo' THEN 'SAMBA'            
            END
 WHERE LOGIN IN ('arachel', 'mandanah','kbianca','lmorgan','idcruz''pcastillo');

【讨论】:

根据数据,添加where LOGIN IN ('arachel', ...) 以减少事务大小可能是一个好主意。 Yes Thats make sens -Thats 为什么已经放置了 ELSE 部分,如果上述条件不成立,将设置相同的值 我不知道Oracle如何处理更新为与以前相同的值的列值。它是否包含在写入集等中?【参考方案3】:

这里的每个人都根据“一次查询”请求给出了答案。他们都很好。您需要使用case 语句和where 条件。

对于您问题的“高效方式”部分,如果您还没有 INDEX 字段,则必须在 login 字段中添加它。

所以,应该是:

create index IDX_DANCER_TYPE_LOGIN on DANCER_TYPE(login);

并使用@SamiKuhmonen 的答案

UPDATE DANCER_TYPE SET TYPE = CASE login
                                WHEN 'arachel' THEN 'BALLET'
                                WHEN 'mandanah' THEN 'EXOTIC_BELLY_DANCER'
                                ...
                                END
                 WHERE login IN ('arachel', 'mandanah', ...);

加上他对else的解释

在我看来,没有more scaleable way 然后运行与创建的索引分开的更新。

【讨论】:

【参考方案4】:

“最佳”、“最具扩展性”和“最高效”的定义可以有非常不同的含义。您必须先定义它们。***效果不好。

但是如果你想要一个查询,你可以使用CASE:

UPDATE DANCER_TYPE SET TYPE = CASE login
  WHEN 'arachel' THEN 'BALLET'
  WHEN 'mandanah' THEN 'EXOTIC_BELLY_DANCER'
  ...
  END
  WHERE login IN ('arachel', 'mandanah', ...);

WHERE 条件可确保您不会更新不必要的字段。根据 RDBMS 实现,您可能只使用 ELSE type 而没有 WHERE 条件。

【讨论】:

我喜欢那里的 WHERE 条件,没想到 :)【参考方案5】:

假设您使用的是 InnoDB,由于 xaction 开销,在单个事务中执行 UPDATEs 会有所帮助:

BEGIN;
UPDATE ...
UPDATE ...
...
COMMIT;

可能其他答案中提到的CASEWHERE 的使用比这更快。

【讨论】:

以上是关于MYSQL多次更新的主要内容,如果未能解决你的问题,请参考以下文章

mysql update更新,一次还是多次快?

使用fdmemTable来代替clientDataset,解决MySQL5.6(含)以上版本用cds多次更新时的错误

mySQL Workbench 中的数据类型未更新

MySQL的事务隔离级别

MySql 的事务隔离级别

如何理解access设置中的“级联更新”和“级联删除”?