制御された冗長性と複合FK制約を使用してそれを行うことができます:
CREATE TABLE offr (
offr_id INT NOT NULL,
coy_id INT NOT NULL,
PRIMARY KEY (offr_id),
FOREIGN KEY (coy_id) REFERENCES ins_coy (coy_id),
UNIQUE KEY (offr_id, coy_id)
);
subscribe
で複合FK制約をサポートするために、複合一意キー(offr_id、coy_id)を追加しました テーブル。
CREATE TABLE provide (
coy_id INT NOT NULL,
type_id INT NOT NULL,
PRIMARY KEY (coy_id, type_id),
FOREIGN KEY (coy_id) REFERENCES ins_coy (coy_id)
);
ここでの複合主キーは、subscribe
の複合FK制約に最適です。 テーブル。
CREATE TABLE subscribe (
naf_no INT NOT NULL,
coy_id INT NOT NULL,
type_id INT NOT NULL,
PRIMARY KEY (naf_no, type_id),
FOREIGN KEY (naf_no, coy_id) REFERENCES offr (offr_id, coy_id),
FOREIGN KEY (coy_id, type_id) REFERENCES provide (coy_id, type_id)
);
複合FK制約が重複することにより、役員は、自分が登録している会社が提供する保険にのみ加入できるようになります。coy_id
論理的に冗長ですが、整合性のために必要であり、FKの制約による更新の異常のリスクはありません。
または、トリガーを使用して、値が内部結合を介して関連付けられていることを確認することもできます。
CREATE TRIGGER check_subscribe BEFORE INSERT OR UPDATE ON subscribe
FOR EACH ROW
WHEN NOT EXISTS (
SELECT 1
FROM offr
INNER JOIN provide ON offr.coy_id = provide.coy_id
WHERE offr.offr_id = new.naf_no AND provide.type_id = new.type_id
)
RAISE_APPLICATION_ERROR (num => -20000, msg => 'Officers can only subscribe to types provided by their company');
免責事項:これをSqlFiddleでテストできず、Oracleがインストールされていませんが、正しい方向を示してくれることを願っています。