Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MYSQL多次更新_Mysql_Sql_Performance - Fatal编程技术网

MYSQL多次更新

MYSQL多次更新,mysql,sql,performance,Mysql,Sql,Performance,我想一次更新表的同一列,用于不同的情况。我能做到这一点的最佳方式是什么?例如,我希望在一个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

我想一次更新表的同一列,用于不同的情况。我能做到这一点的最佳方式是什么?例如,我希望在一个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列的最佳方式是什么?

用例-表达式

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');
“最佳”、“最具可扩展性”和“最高效”的定义可能有非常不同的含义。你必须先定义它们。最高级的不好用

但是,如果需要单个查询,可以使用
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类型
和no
WHERE
条件

UPDATE DANCER_TYPE
   SET TYPE = CASE LOGIN 
                      WHEN 'arachel' THEN 'BALLET' 
                      WHEN 'mandanah' THEN 'EXOTIX_BELLY_DANCER' 
                      ELSE 'YOURELSEVALUE'
                   END;

应该适用于您的案例(仅做了两个示例)

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

UPDATE DANCER_TYPE
   SET TYPE = CASE LOGIN 
                      WHEN 'arachel' THEN 'BALLET' 
                      WHEN 'mandanah' THEN 'EXOTIX_BELLY_DANCER' 
                      ELSE 'YOURELSEVALUE'
                   END;
对于问题的“有效方式”部分,如果您还没有
索引,则必须在
登录
字段中添加该索引

因此,它将是:

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', ...);
加上他对<代码>的解释


在我看来,没有比
更具可伸缩性的方法了
然后运行与创建的索引分开的更新。

假设您使用的是InnoDB,在单个事务中执行
更新
会有帮助,因为X操作开销:

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

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

根据数据,可以在登录位置('arachel',…)添加
以降低事务大小。是的,
s make sens-那
s如果上述条件不成立,为什么已经放置将设置相同值的其他部分?我不知道Oracle如何处理更新为相同值的列值。它是否包含在写集等中?我喜欢那里的WHERE条件,没有想到:)您试图解决的问题是什么?之所以需要它只是一条语句?如果您不想在其他语句上执行任何操作,只需使用:else null而不使用
WHERE
,这将扫描整个表并更改每一行@RickJames这不是OP想要的:自动为每个舞者分配类型吗