【问题标题】:Postgresql update 2 tables in one update statementPostgresql 在一个更新语句中更新 2 个表
【发布时间】:2015-08-16 14:57:26
【问题描述】:

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

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

【问题讨论】:

  • 那行不通。您的目标是确保两个更新都完成,还是在出现问题时都不做?

标签: postgresql sql-update multi-query


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

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

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

【讨论】:

  • 我有 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 答案。
  • 谢谢,我用过交易。
  • 问题是关于一个声明的解决方案。回应应该说“不。这是不可能的”,然后给出替代方案
  • @apflieger 除了有可能,这就是我将 CTE 包含在其中的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多