多行更新为一个查询

txu3uszq  于 2021-06-20  发布在  Mysql
关注(0)|答案(3)|浏览(273)

我需要更新超过3000行,但如果我运行3000多个更新查询,它会变得太慢。
(这是我要更新的表)

items (
    id INT(11) NOT NULL,
    name VARCHAR(255) NOT NULL,
    members_only TINYINT(1) NOT NULL,
    price INT(11) NOT NULL,
    PRIMARY KEY (id)
);

所以我在想,是否有一种方法可以像这样一次更新多行(因为在某种程度上,如果我将所有行合并起来,它应该运行得更快)。

UPDATE items SET name='name1', members_only=1, price=20 WHERE id=1 AND 
SET name='name2', members_only=0, price=70 WHERE id=2 AND 
SET name='name3', members_only=0, price=40 WHERE id=3...;
avwztpqn

avwztpqn1#

我建议使用 join :

UPDATE items i JOIN
       (SELECT 1 as id, 'name1' as name, 1 as members_only, 20 as price UNION ALL
        . . .
       ) newdata
       USING (id)
    SET i.name = newdata.name2,
        i.members_only = newdata.members_only,
        i.price = newdata.price;

或者,为每个应用程序运行单独的更新 id 在同一事务中,因此它们都在同一时间生效。

yeotifhr

yeotifhr2#

也许它可以运行得更快,通过使用事务。这样地:

Begin Transactions;
update ...
update ...
...
update ...
//Each of normal update SQL statment
Commit Transactions;
6l7fqoea

6l7fqoea3#

可以使用case语句更新多行

update items set name=(case when id='1' then 'name1' when id='2' then 'name2' when id='3' then 'name3' end),
members_only=(case when id='1' then '1' when id='2' then '0' when id='3' then '0' end),
price=(case when id='1' then '20' when id='2' then '70' when id='3' then '40' end) 
where id='1' or id='2' or id=3;

相关问题