使用案例和子查询 MySql 更新多个表

Update mutiple tables using case and subquery MySql

我正在重组一些代码,这是一个 PHP - MYSQL 项目。所以我试图在一个或至少两个查询中更新一些 table。

这是否可以在没有连接的情况下实现?什么是最好的选择?

UPDATE document D SET D.status = 2,
    CASE 
        WHEN D.type 'A' THEN (UPDATE table_1 SET active = 1 WHERE id_table1 = D.id_document)
        WHEN D.type 'B' THEN (UPDATE table_2 SET active = 1 WHERE id_table2 = D.id_document)
        WHEN D.type 'C' THEN (UPDATE table_3 SET active = 1 WHERE id_table3 = D.id_document)            
    END 
WHERE D.id_document = %s

我不介意将第一个 table“文档 D”分开,但我需要“case when”在单个查询中更新多个 tables,因为它们就像 11 tables.

您是否试图将所有内容放在一个查询中以提高性能?这在这种情况下无济于事,因为它所花费的时间与单独执行每个子查询所花费的时间相同。

如果您在 php 代码中确定 table 名称,然后将其传递给更简单的查询字符串,您将获得更简洁的代码和更好的性能。

不要让问题悬而未决。根据我的研究。

  • 不,您不能在子查询中执行 "update"。
  • 不,你不能那样使用 "case"。

唯一能做的就是:

使用连接更新多个表

UPDATE table_1
INNER JOIN table_2 ON table_1.id = table_2.id
INNER JOIN table_3 ON table_3.id = table_3.id
SET table_1.column = '', table_2.column = ''
WHERE any condition;

而"case"只能单一使用

UPDATE table SET
column = CASE columX WHEN 'A' THEN '2' ELSE column END,
column2 = CASE columX WHEN 'B' THEN '2' ELSE column2 END

结合两者,我能够实现我所需要的。

请记住,您可以使用 "where" 进行不同类型的加入和游戏。在 "case" 子句中,更新列是强制性的,而不是可选的,所以我在 "else" 中使用相同的列,以便在不需要更新该列时保留默认值。