sql >> Databáze >  >> RDS >> Oracle

Jak zajistím integritu mezi nesouvisejícími tabulkami?

Můžete to udělat pomocí řízené redundance a složených FK omezení:

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)
);

Přidal jsem složený jedinečný klíč (offr_id, coy_id), který podporuje složené omezení FK na subscribe tabulka.

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)
);

Zde složený primární klíč je ideální pro složené omezení FK na subscribe tabulka.

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)
);

Překrývající se složená omezení FK zajistí, že úředník si může předplatit pouze pojištění nabízené společností, ve které je registrován. coy_id je logicky redundantní, ale vyžaduje se pro integritu a nehrozí žádné anomálie aktualizace kvůli omezením FK.

Alternativně můžete použít spouštěče ke kontrole, že hodnoty spolu souvisí prostřednictvím vnitřních spojení:

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');

Prohlášení:Nemohl jsem to otestovat na SqlFiddle a nemám nainstalovaný Oracle, ale doufám, že vás to nasměruje správným směrem.




  1. Jak nainstalovat MySQL 5.7 na Amazon ec2

  2. MySQL ovladač pro Rails ve Windows 7 x64

  3. Jak NOT REGEXP funguje v MySQL

  4. Jak zlepšit přesnost databáze