查询更新MySQL不使用子句IN

时间:2014-07-29 05:01:01

标签: mysql sql-update

虽然子查询正在运行,但我的查询无效。

UPDATE `qan_postmeta` SET `meta_value` = 'NEW' WHERE `meta_id` IN (SELECT `meta_id` FROM `qan_postmeta` WHERE `meta_value` = 'OLD')

2 个答案:

答案 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';