2015-06-02 40 views
1

我有相同的字段两个不同的标签,如:PostgreSQL的更新2个表中一个更新语句

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

这是行不通的。您的目标是确保两项更新都完成,或者如果出现问题,则无? – fvu

回答

0

我真的不明白你的架构。如果你可以设置一个很好的小提琴。

虽然在一般更新单个查询的选项有两个表:

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

SQL捣鼓这在http://sqlfiddle.com/#!15/fa4d3/1

虽然在一般,它可能是最简单,最可读只是做2个更新包在一个事务。

+0

我有MySQL查询: LEFT JOIN服务更新主机ON hosts.host_id = services.host_id SET hosts.enabled = 0,services.enabled = 0,其中在MySQL hosts.instance_id = 1 此查询做工精细,但PostgreSQL的不理解左侧加入这个位置。 – r1se

+0

这就是为什么我没有在你的postgresql问题中包含mysql答案的原因。 – Gary

+0

谢谢,我用过交易。 – r1se