1

postgresql で更新をカスケードする必要があるテーブルがいくつかありますが、それを行うために外部キーを使用できるとは思いません。

簡単なバージョンでは、4 つのオブジェクト テーブルと 2 つの結合テーブルがあります。

Table X    Table A       Table A-B      Table B      Table B-C    Table C
-------    --------      ---------      -------      ---------    -------
x_id         a_id           x_id          b_id          x_id        c_id
...          ...            a_id          ...           b_id        ...
...          ...            b_id          ...           c_id        ...
                            ...                         ...

私の結合テーブルでは、すべての id フィールド (x_id、a_id、b_id)、(x_id、b_id、c_id) に PK があります。

テーブル AB の b_id を更新する場合、x_id が一致するテーブル BC の b_id を更新する必要があります。

外部キー制約を作成しようとすると、

「参照されるテーブルの指定されたキーに一致する一意の制約はありません...」

(x_id,b_id) は一意の制約ではないため、それを行っていないことは理解していますが、同じ b_id と x_id を持つ複数の c_id があるため、それはできません。

うまくいけば、これは理にかなっています。

トリガーでこれを行う唯一の方法はありますか?

4

1 に答える 1

1

(x_id,b_id) は一意の制約ではないため、それを行っていないことは理解していますが、同じ b_id と x_id を持つ複数の c_id があるため、それはできません。

テーブル AB の b_id を更新してテーブル BC にカスケードするには、次のものが必要です。

  • Table_A-C.b_id を含むいくつかの列のセットに対する一意の制約、
  • Table_B-C の同じ列セット、および
  • ON UPDATE CASCADE を使用して、Table_A-C の同じ列セットを参照する Table_B-C の外部キー参照。

現在の構造でそれが可能かどうかはわかりません。

もしも

  • Table_A-B.x_id は自動インクリメント整数で、それ自体が一意です。
  • Table_A-B では、列のセット {x_id, b_id} も一意になり、
  • Table_B-C で、列 x_id が整数 (または bigint) の場合、
  • Table_B-C では、列のセット {x_id, b_id} は、Table_A-C への外部キー参照を持つことができます。
于 2012-10-25T23:40:02.060 に答える