sql >> Database >  >> RDS >> Oracle

Hoe zorg ik voor integriteit tussen niet-gerelateerde tabellen?

U kunt dit doen met behulp van gecontroleerde redundantie en samengestelde FK-beperkingen:

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

Ik heb een samengestelde unieke sleutel (offr_id, coy_id) toegevoegd om een ​​samengestelde FK-beperking op de subscribe te ondersteunen tafel.

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

De samengestelde primaire sleutel hier is perfect voor een samengestelde FK-beperking op de subscribe tafel.

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

Overlappende samengestelde FK-beperkingen zorgen ervoor dat een functionaris zich alleen kan abonneren op een verzekering die wordt aangeboden door het bedrijf waarbij hij/zij is ingeschreven. coy_id is logisch redundant maar vereist voor integriteit en er is geen risico op update-afwijkingen vanwege de FK-beperkingen.

Als alternatief kunt u triggers gebruiken om te controleren of de waarden gerelateerd zijn via inner joins:

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

Disclaimer:ik heb dit niet kunnen testen op SqlFiddle en heb Oracle niet geïnstalleerd, maar hopelijk wijst het je in de goede richting.




  1. Een Java-toepassing maken in Oracle JDeveloper, deel 1

  2. Hoe kan ik de stringwaarde van het datatype van Oracle bepalen aan de hand van de code?

  3. Verwijder dubbele records met rownum in sql

  4. Hoe een databasetabel te beperken, zodat slechts één rij een bepaalde waarde in een kolom kan hebben?