MySQL UPDATE字段FROM SELECT

时间:2012-08-25 19:33:21

标签: mysql select

我想在一个符合几个条件的表中更新一些结果(即来自其他表的变量以匹配SELECT语句)

我在网上发现了类似的东西:

START TRANSACTION;
SELECT * FROM score_test,score_2,score_3, etc WHERE score=20000 AND score_test.id=score_2.id AND etc.. FOR UPDATE;
UPDATE score_test SET name='Test';
COMMIT;

注意:UPDATE score_test SET ... WHERE不满足我的需要,因为我需要收集满足SELECT语句的结果

但它没有用。它会更新我的所有字段。我正在寻找的是一种语法,用于仅更新SELECT语句中的RESULTS。

我的数据库被分成10-15个表,条件可能会有所不同,因为我必须更新一些严格完成某些条件的字段,这些条件取决于来自其他表的查询。

2 个答案:

答案 0 :(得分:3)

SQL UPDATE语句接受WHERE子句,就像SELECT语句一样:

UPDATE score_test SET name='Test' WHERE score=20000;

修改

您还可以将UPDATE后面的部分视为跟SELECT之后的FROM部分大致相同,这意味着您可以进行加入:

UPDATE score_test 
  JOIN test ON test.id=score_test.test_id
SET score_test.name = 'Test'
WHERE score_test.score=20000

此提示位于the UPDATE documentation,其中语法定义中使用table_reference符号。 table_reference的语法定义为on the JOIN page。在SELECTUPDATE查询中隐含相同的处理方式。

关于FOR UPDATE

的说明

FOR UPDATE语句中的SELECT子句不会实际执行与更新相关的任何操作...它只会收集对行的锁定。您仍然需要使用适当的UPDATE查询来执行此操作,该查询执行所有必要的JOINS和WHERE(可能与您的SELECT相同)

答案 1 :(得分:0)

有多种方法可以完成您的要求。最简单的只是满足你的问题就是做一个更新。

UPDATE score_test SET name='Test' WHERE score=20000;

如果要满足多个表的条件,可以在update语句中使用连接,就像select语句一样。

如果你有这么复杂的用例,你可以通过创建一个包含你想要编辑的项目的ID的临时表来进一步完成你的目标,并逐个剔除该表到多个DELETE查询,直到您有要更新的集。