当涉及到sql查询时,我有点像菜鸟,而且我只使用了基本的SELECT,UPDATE,DELETE语句。现在我需要在垂直表中更新很多行(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会有所不同吗?
感谢任何帮助
答案 0 :(得分:3)
你只能使用一个带有update
语句的case
,但没有常见条件也会将通用条件带到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;
答案 1 :(得分:0)
如果您知道更新的每一行的主键,则另一种方法是使用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)
未被声明为唯一约束,那么您需要首先选择要知道要更新的行的主键,但要小心并考虑可能适用于您的可能的竞争条件情况。