5

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

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
4

1 回答 1

2

我真的不明白你的架构。如果你能设置一个小提琴,那就太好了。

一般来说,虽然要在单个查询中更新两个表,但选项是:

扳机

这假设您总是希望同时更新两者。

存储过程/函数

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

Postgres CTE 扩展

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

SQL Fiddle 在http://sqlfiddle.com/#!15/fa4d3/1

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

于 2015-06-02T17:31:41.203 回答