我有两个不同的标签,包含相同的字段,例如:
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
答案 0 :(得分: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表上设置标志,然后运行主更新,这将更新服务表中的记录。
在http://sqlfiddle.com/#!15/fa4d3/1
的SQL小提琴一般来说,它可能是最简单和最易读的,只需要在事务中包含2个更新。