运行 多个 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 以了解要更新的行的主键,但要小心并考虑可能的竞争可能适用于您的情况的条件。
我在 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 以了解要更新的行的主键,但要小心并考虑可能的竞争可能适用于您的情况的条件。