虽然子查询正在运行,但我的查询无效。
UPDATE `qan_postmeta` SET `meta_value` = 'NEW' WHERE `meta_id` IN (SELECT `meta_id` FROM `qan_postmeta` WHERE `meta_value` = 'OLD')
答案 0 :(得分:1)
如果您关心性能,请不要使用像
这样的查询UPDATE qan_postmeta SET meta_value = NEW WHERE meta_id IN (SELECT meta_id FROM qan_postmeta WHERE meta_value = OLD)
MySQL没有对此进行优化,并且似乎扫描了更新语句中每一行的索引的临时表。这也适用于UPDATE
以外的其他语句。
相反,要么使用JOIN
之类的
UPDATE qan_postmeta INNER JOIN qan_postmeta ON qan_postmeta.meta_id = meta_id SET meta_value = NEW WHERE meta_value = OLD
请注意MySQL可以使用很多但不是太多的参数。将100&#39000个参数列表传递给IN
语句将无法正常工作。
来源:http://makandracards.com/makandra/2681-mysql-do-not-use-where-id-in-select
答案 1 :(得分:0)
您可以使用此查询
UPDATE tab_1 a
JOIN tab_2 b
ON a.meta_id=b.meta_id
SET a.meta_value='new'
WHERE b.meta_value='old';