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

时间:2015-06-02 17:14:21

标签: postgresql sql-update multi-query

我有两个不同的标签,包含相同的字段,例如:

host.enabled, service.enabled.

我如何更新他的1更新声明?

我试过了:

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

1 个答案:

答案 0 :(得分:1)

我没有真正理解你的架构。如果你可以设置一个很棒的小提琴。

通常,虽然要在单个查询中更新两个表,但选项为:

Trigger

这假设您总是希望一起更新。

Stored procedure/function

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

Postgres CTE extension

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表上设置标志,然后运行主更新,这将更新服务表中的记录。

http://sqlfiddle.com/#!15/fa4d3/1

的SQL小提琴

一般来说,它可能是最简单和最易读的,只需要在事务中包含2个更新。