0

私は3つのテーブルを持っています:

{op_id, op_name, .}

B {b_id、op_id、supplier_id、.}

C {c_id、op_id、op_id2、supplier_id、関係、.}

テーブル B と C には、テーブル A の外部キーである op_id があります。テーブル A では op_id が主キー、テーブル B では b_id が主キー、テーブル C では c_id が主キーです。テーブル B では、supplier_id と op_id のレコードが重複している可能性があります。テーブル B から op_id のレコードを削除し、テーブル C に op_id の関係レコードが存在する場合は削除できないように、制約を追加します。制約によって可能ですか?

4

2 に答える 2

0

以下のようにあなたが指定したように通常制約を追加します

テーブルAではop_idが主キー、テーブルBではb_idが主キー、テーブルCではc_idが主キーです。

テーブルBとCには、テーブルAの外部キーであるop_idがあります。

指定した最後の条件については、before deleteテーブルBにトリガーを書き込み、op_idがテーブルCに存在するかどうかを確認します。存在する場合はエラーをスローし、そうでない場合は許可します。

お役に立てれば。

于 2013-01-04T13:41:02.383 に答える
0

主要な制約のほとんどはかなり些細なものです。難しい部分は最後の部分であり、最初に C から行を削除しないと B から行を削除できないことを保証します。

ここで機能する可能性のあるアプローチの 1 つは、C には存在するが B には存在しない一意の OP_ID の数のカウントを返す高速リフレッシュ可能な「コミット時」マテリアライズド ビューを作成することです。カウントが常にゼロでなければならないことを強制するビュー。この制約はコミットの時点で適用され、最初に C から削除せずに B から削除することを防ぎます (一致するレコードが C に存在するときに B から削除すると、マテリアライズド ビューのカウントが 0 より大きいため、チェック制約に違反します)。 . これの副作用は、最初に B に挿入しないと C に挿入できないことです。

于 2013-01-05T16:17:17.533 に答える