MySQL:如何基于不可更新视图的匹配结果更新表列
解决方案
你不需要通过视图更新,直接写跨表关联的UPDATE语句即可实现需求,有两种常用实现方式:
方式1:使用EXISTS子查询(兼容性最好,所有主流SQL数据库都支持)
直接判断当前deployment是否存在关联的data_msgs记录,匹配到就更新字段:
UPDATE deployment SET `condition` = TRUE WHERE EXISTS ( SELECT 1 FROM messages JOIN data_msgs ON data_msgs.messages_id = messages.id WHERE messages.deployment_id = deployment.id );
注意:
condition是SQL保留关键字,所以用反引号包裹避免语法报错,如果你的数据库用双引号做标识符包裹,替换成双引号即可。
方式2:用IN子查询匹配视图筛选出的ID(和你现有的视图逻辑完全对齐)
如果不想修改你已经写好的视图逻辑,直接复用视图的ID结果更新即可:
UPDATE deployment SET `condition` = TRUE WHERE id IN (SELECT id FROM condition_true);
额外说明
如果需要同时把没有对应data_msgs的部署的condition设为FALSE,只要在上面的语句执行完成后,补一条反向更新即可:
UPDATE deployment SET `condition` = FALSE WHERE id NOT IN (SELECT id FROM condition_true);
也可以把两条逻辑合并成一条(MySQL为例):
UPDATE deployment LEFT JOIN ( SELECT DISTINCT deployment.id AS did FROM deployment JOIN messages ON messages.deployment_id = deployment.id JOIN data_msgs ON data_msgs.messages_id = messages.id ) t ON deployment.id = t.did SET `condition` = IF(t.did IS NOT NULL, TRUE, FALSE);
内容的提问来源于stack exchange,提问作者Kat
相关产品推荐
相关产品推荐

