Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Làm cách nào để đảm bảo tính toàn vẹn giữa các bảng không liên quan?

Bạn có thể làm điều đó bằng cách sử dụng dự phòng có kiểm soát và các ràng buộc FK tổng hợp:

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

Tôi đã thêm một khóa duy nhất tổng hợp (offr_id, coy_id) để hỗ trợ ràng buộc FK tổng hợp trên subscribe bảng.

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

Khóa chính tổng hợp ở đây là hoàn hảo cho ràng buộc FK tổng hợp trên subscribe bảng.

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

Các ràng buộc FK tổng hợp chồng chéo sẽ đảm bảo rằng một nhân viên chỉ có thể đăng ký bảo hiểm do công ty mà anh / cô ấy tham gia cung cấp. coy_id là dư thừa về mặt logic nhưng cần thiết để đảm bảo tính toàn vẹn và không có nguy cơ cập nhật bất thường do các ràng buộc FK.

Ngoài ra, bạn có thể sử dụng trình kích hoạt để kiểm tra xem các giá trị có liên quan với nhau hay không thông qua các phép nối bên trong:

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

Tuyên bố từ chối trách nhiệm:Tôi không thể kiểm tra điều này trên SqlFiddle và chưa cài đặt Oracle, nhưng hy vọng nó sẽ giúp bạn đi đúng hướng.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tại sao tôi dường như không thể buộc Oracle 11g tiêu thụ nhiều CPU hơn cho một truy vấn SQL duy nhất

  2. Lỗi rút phích cắm PDB ORA-17528

  3. Lỗi SQL:ORA-01861:chữ không khớp với chuỗi định dạng 01861

  4. Tại sao tôi nhận được PLS-00302:thành phần phải được khai báo khi nó tồn tại?

  5. Sự cố khi gặp lỗi Oracle Form Builder FRM-10044