运行 多个 UPDATE sql 语句是否有更有效的方法

Is there a more efficient way to run multiple UPDATE sql statements

我在 sql 查询方面有点菜鸟,我只真正使用过基本的 SELECT、UPDATE、DELETE 语句。现在我需要在垂直 table 中更新很多行 (50+),并且我 运行 宁这样的语句:

UPDATE `postmeta` SET meta_value = 'John' WHERE `meta_key` = 'name' AND `post_id` = 29230;
UPDATE `postmeta` SET meta_value = 'Johnson' WHERE `meta_key` = 'last_name' AND `post_id` = 29230;
UPDATE `postmeta` SET meta_value = 'www.johnsonsdiner.com' WHERE `meta_key` = 'url' AND `post_id` = 29230;
UPDATE `postmeta` SET meta_value = 'john@johnson.com' WHERE `meta_key` = 'mail' AND `post_id` = 29230;
UPDATE `postmeta` SET meta_value = '12341234' WHERE `meta_key` = 'phone' AND `post_id` = 29230;
... + 45 more

注意 post_id 相同,而 meta_key 不同。

是否有更好的方法来 运行 所有这些更新,从而使 mySQL 的性能更好?在每个语句中添加 LIMIT 1 会有所不同吗?

感谢任何帮助

您只能使用一个 update 和一个 case 语句用于 none 公共条件也将公共条件带到 where 子句:

UPDATE `postmeta`
        SET meta_value = case
             when `meta_key` = 'name' then 'John'
             when `meta_key` = 'last_name' then 'Johnson'
             when `meta_key` = 'url' then 'www.johnsonsdiner.com'
             when `meta_key` = 'mail' then 'john@johnson.com'
             when `meta_key` = 'phone' then '12341234' 
             .
             ...45 more
             .
             end
where `post_id` = 29230;

如果您知道更新的每一行的主键,另一种方法是使用 INSERT ON DUPLICATE KEY UPDATE。

因此假设(出于说明目的)(post_id, meta_key) 是您的主键,以下查询将解决您的需求:

INSERT INTO postmeta (post_id, meta_key, meta_value)
VALUES (29230,'name','John'), (29230,'last_name','Johnson'),...
ON DUPLICATE KEY UPDATE meta_value = VALUES(meta_value)

如果 (post_id, meta_key) 未声明为唯一约束,则您需要先执行 select 以了解要更新的行的主键,但要小心并考虑可能的竞争可能适用于您的情况的条件。