Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak zapewnić integralność między niepowiązanymi tabelami?

Możesz to zrobić za pomocą kontrolowanej nadmiarowości i złożonych ograniczeń 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)
);

Dodałem unikalny klucz złożony (offr_id, coy_id) do obsługi ograniczenia złożonego FK na subscribe tabeli.

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

Złożony klucz podstawowy jest tutaj idealny do ograniczenia złożonego FK na subscribe tabeli.

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

Nakładające się na siebie złożone ograniczenia FK zapewnią, że funkcjonariusz będzie mógł subskrybować tylko ubezpieczenie oferowane przez firmę, w której jest zapisany. coy_id jest logicznie nadmiarowy, ale wymagany do zachowania integralności i nie ma ryzyka anomalii aktualizacji ze względu na ograniczenia FK.

Alternatywnie możesz użyć wyzwalaczy, aby sprawdzić, czy wartości są powiązane za pomocą sprzężeń wewnętrznych:

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

Zastrzeżenie:nie mogłem przetestować tego na SqlFiddle i nie mam zainstalowanego Oracle, ale mam nadzieję, że wskaże ci to właściwy kierunek.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Błąd Oracle .NET — Niewłaściwa liczba lub typ argumentów

  2. jak możemy pogrupować od 17:00 wczoraj do 17:00 dzisiaj zapisy do dzisiejszej daty?

  3. jak zamienić wiele ciągów razem w Oracle

  4. JBoss automatycznie łączy się ponownie z bazą danych po ponownym uruchomieniu/rozłączaniu bazy danych

  5. Grupuj według miesiąca w Oracle