3

Postgresへの強制参加を表す最良の方法は何ですか? 以前は CHECK 制約を使用するか、Sybase で INSERT および DELETE TRIGGER を使用して実行していました。Postgres は CHECK 制約でサブクエリをサポートしていないため、トリガーを正しく取得できません。

次の代替手段を見つけたいと思います。

ALTER TABLE member
 ADD CONSTRAINT member_in_has_address
  CHECK (EXISTS (SELECT *
                 FROM address a
                 WHERE member_id = a.member_id));
4

2 に答える 2

4

遅延可能な制約トリガーを使用して、1:m の必須関係を解決します。

ロジックは次のとおりです。

  • 親レコードを挿入します。これにより、トリガーがスケジュールされます
  • 少なくとも 1 つの子レコードを挿入します
  • 専念

トリガーはコミットの直前に実行され、表示内容が気に入らない場合は例外を発生させてコミットを中止できます。

于 2013-01-04T01:59:30.180 に答える
0

要約すると、問題は次の方法で解決できます。

  • 関数でクエリを定義し、CHECK 制約から呼び出す
  • 例外をスローする関数を定義し、トリガーから呼び出す
  • 遅延制約トリガーの定義

私はそれらすべてを試すつもりです。

于 2013-01-22T20:00:20.597 に答える