MYSQL多次更新

时间:2016-10-20 12:33:18

标签: 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 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列的最佳方法是什么?

5 个答案:

答案 0 :(得分:2)

Use CASE - EXPRESSION

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');

答案 1 :(得分:2)

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

should work for your case (only did 2 examples)

答案 2 :(得分:2)

Everyone here gave an answer based on the 'one query' request. They are all right. you need to use a case statement AND the where condition.

For the 'efficient manner' part of your question, you have to add an INDEX on the login field if you don't have it already.

So, it would be:

create index IDX_DANCER_TYPE_LOGIN on DANCER_TYPE(login);

And use the answer from @SamiKuhmonen

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

Plus his explanation on the else

IN MY OPINION there is no more scaleable way then run the updates separated with the index created.

答案 3 :(得分:1)

The definition of "best", "most scalable" and "most efficient" can have very different meanings. You'll have to define them first. Superlatives don't work well.

But if you want a single query you can use CASE:

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

The WHERE condition to make sure you don't update unnecessary fields. Depending on RDBMS implementation you might get away with just ELSE type and no WHERE condition.

答案 4 :(得分:0)

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

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

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