Postgresql在一条update语句中更新2个表

Postgresql在一条update语句中更新2个表,postgresql,sql-update,multi-query,Postgresql,Sql Update,Multi Query,我有两个具有相同字段的不同选项卡,如: host.enabled, service.enabled. 我如何更新他的from 1 update语句 我试过: UPDATE hosts AS h, services AS s SET h.enabled=0, s.enabled=0 WHERE ctid IN ( SELECT hst.ctid FROM hosts hst LEFT JOIN services srv ON hst.host_id = srv.host_

我有两个具有相同字段的不同选项卡,如:

host.enabled, service.enabled.
我如何更新他的from 1 update语句

我试过:

UPDATE hosts AS h, services AS s SET h.enabled=0, s.enabled=0
    WHERE
    ctid IN (
    SELECT hst.ctid FROM hosts hst LEFT JOIN services srv ON hst.host_id = srv.host_id
        WHERE hst.instance_id=1
    );
在mysql语法上,此查询的工作方式如下:

UPDATE hosts LEFT JOIN services ON hosts.host_id=services.host_id SET hosts.enabled=0, services.enabled=0 WHERE hosts.instance_id=1

我不太理解你的模式。如果你能摆好小提琴那就太好了

但一般来说,要在一个查询中更新两个表,选项如下:

这就假设您总是希望同时更新这两个

因此,您将在函数中作为多个查询来执行,但它可以由来自客户端的单个SQL语句触发

Postgres允许通用表表达式(带子句)使用数据操作

with changed_hosts as (
  update hosts set enabled = true 
  where host_id = 2 
  returning * 
)
update services set enabled = true 
where host_id in (select host_id from changed_hosts);
在这种情况下,WITH语句中的更新将运行并在hosts表上设置标志,然后运行主更新,更新services表中的记录

SQL为这个在


不过,一般来说,在一个事务中进行两次更新可能是最简单、最易读的。

这行不通。您的目标是确保两个更新都完成,还是在出现问题时不进行更新?我有一个mysql查询:UPDATE hosts LEFT JOIN services ON hosts.host_id=services.host_id SET hosts.enabled=0,services.enabled=0 WHERE hosts.instance_id=1此查询在mysql上运行良好,但是postgresql不理解这个位置的左连接。这就是为什么我没有为你的postgresql问题提供mysql答案的原因。谢谢,我已经习惯了事务。这个问题是关于一个带有一条语句的解决方案。回答应该是“不,不可能”,然后给出答案alternatives@apflieger除了这是可能的,这就是为什么我把CTE包括在里面。