我想在一个符合几个条件的表中更新一些结果(即来自其他表的变量以匹配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个表,条件可能会有所不同,因为我必须更新一些严格完成某些条件的字段,这些条件取决于来自其他表的查询。
答案 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。在SELECT
和UPDATE
查询中隐含相同的处理方式。
FOR UPDATE
FOR UPDATE
语句中的SELECT
子句不会实际执行与更新相关的任何操作...它只会收集对行的锁定。您仍然需要使用适当的UPDATE
查询来执行此操作,该查询执行所有必要的JOINS和WHERE(可能与您的SELECT
相同)
答案 1 :(得分:0)
有多种方法可以完成您的要求。最简单的只是满足你的问题就是做一个更新。
UPDATE score_test SET name='Test' WHERE score=20000;
如果要满足多个表的条件,可以在update语句中使用连接,就像select语句一样。
如果你有这么复杂的用例,你可以通过创建一个包含你想要编辑的项目的ID的临时表来进一步完成你的目标,并逐个剔除该表到多个DELETE
查询,直到您有要更新的集。