【问题标题】:MySQL: Update a column based on membership in a non-updateable viewMySQL:根据不可更新视图中的成员身份更新列
【发布时间】:2021-10-03 14:31:29
【问题描述】:

我在一个表中有一个列,我想根据另一个表中的条件将其设置为 true 或 false,该表仅通过第三个表与第一个表相关。第一个表是部署表,第二个表包含每个部署的消息(每个部署有许多消息),第三个表包含仅来自某些消息的 msg_data。并非所有部署都将包含 data_msg 消息,但如果包含,我想将部署表中的列设置为 TRUE。我创建了一个表视图,显示了该列应设置为 true 的所有行:

CREATE VIEW condition_true AS
SELECT DISTINCT deployment.id, deployment.condition
FROM deployment
JOIN messages ON messages.deployment_id = deployment.id
JOIN data_msgs ON data_msgs.messages_id = messages.id
GROUP BY deployment.id;

由于多种原因,此视图本身不可更新,但显然我想做的是

UPDATE condition_true
SET condition_true.condition = TRUE;

谁能帮我弄清楚如何做到这一点? 谢谢。

【问题讨论】:

    标签: mysql sql-update inner-join distinct exists


    【解决方案1】:

    假设id 是deployment 的主键,你需要一个UPDATE 语句来连接3 个表:

    UPDATE deployment d
    JOIN messages m ON m.deployment_id = d.id
    JOIN data_msgs dm ON dm.messages_id = m.id
    SET d.condition = true
    

    或者,EXISTS:

    UPDATE deployment d
    SET d.condition = true
    WHERE EXISTS (
      SELECT 1 
      FROM messages m JOIN data_msgs dm 
      ON dm.messages_id = m.id
      WHERE m.deployment_id = d.id
    )
    

    或者,如果您想将列设置为TRUE 或FALSE:

    UPDATE deployment d
    SET d.condition = EXISTS (
      SELECT 1 
      FROM messages m JOIN data_msgs dm 
      ON dm.messages_id = m.id
      WHERE m.deployment_id = d.id
    ) 
    

    另外,在您看来,不需要GROUP BY deployment.id,因为您没有进行任何聚合并且您使用DISTINCT,因此您不会得到任何重复的行..

    【讨论】:

    • 谢谢,虽然我遇到了一个我现在需要解决的锁定表大小问题,但效果很好。
    • @Kat 检查我的第二个查询。
    • 感谢您提供的其他技术,这非常有帮助。我只是在学习 SQL。
    猜你喜欢
    • 2013-10-14
    • 1970-01-01
    • 2020-10-07
    • 2011-03-04
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2019-02-19
    • 2018-06-03
    相关资源
    最近更新 更多