Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie stelle ich die Integrität zwischen nicht verknüpften Tabellen sicher?

Sie können dies mit kontrollierter Redundanz und zusammengesetzten FK-Einschränkungen tun:

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

Ich habe einen zusammengesetzten eindeutigen Schlüssel (offr_id, coy_id) hinzugefügt, um eine zusammengesetzte FK-Einschränkung für subscribe zu unterstützen Tabelle.

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

Der zusammengesetzte Primärschlüssel hier ist perfekt für eine zusammengesetzte FK-Beschränkung für subscribe Tabelle.

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

Sich überschneidende zusammengesetzte FK-Einschränkungen stellen sicher, dass ein Beamter nur eine Versicherung abschließen kann, die von dem Unternehmen angeboten wird, bei dem er/sie eingeschrieben ist. coy_id ist logisch redundant, aber für die Integrität erforderlich, und es besteht kein Risiko von Aktualisierungsanomalien aufgrund der FK-Einschränkungen.

Alternativ könnten Sie Trigger verwenden, um zu prüfen, ob die Werte über Inner Joins zusammenhängen:

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

Haftungsausschluss:Ich konnte dies nicht auf SqlFiddle testen und habe Oracle nicht installiert, aber hoffentlich weist es Sie in die richtige Richtung.