5

次のように、同じフィールドを持つ 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
4

1 に答える 1

2

私はあなたのスキーマを本当に理解していませんでした。フィドルを設定できれば、それは素晴らしいことです。

一般に、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 ステートメントの更新が実行され、hosts テーブルにフラグが設定されます。次にメインの更新が実行され、services テーブルのレコードが更新されます。

このための SQL Fiddle はhttp://sqlfiddle.com/#!15/fa4d3/1にあります。

ただし、一般的には、トランザクションにラップされた 2 つの更新を行うだけで、おそらく最も簡単で読みやすいでしょう。

于 2015-06-02T17:31:41.203 に答える