sql >> データベース >  >> RDS >> Oracle

無関係なテーブル間の整合性を確保するにはどうすればよいですか?

    制御された冗長性と複合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がインストールされていませんが、正しい方向を示してくれることを願っています。




    1. postgresqlinformation_schemaのすべてのテーブルを一覧表示します

    2. パラメータ@objnameがあいまいであるか、要求された@objtype(COLUMN)が間違っているかを解決するにはどうすればよいですか?

    3. SQLSTATE [23000]:有効な制約による整合性制約違反

    4. WindowsにMySQLをインストールする方法