Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да осигуря целостта между несвързани таблици?

Можете да го направите, като използвате контролирано излишък и композитни 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)
);

Добавих съставен уникален ключ (offr_id, coy_id), за да поддържам съставно FK ограничение на subscribe таблица.

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

Композитният първичен ключ тук е идеален за композитно FK ограничение на subscribe таблица.

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

Припокриващите се композитни FK ограничения ще гарантират, че служител може да се абонира само за застраховка, предлагана от компанията, в която той/тя е записан. coy_id е логически излишен, но е необходим за целостта и няма риск от аномалии при актуализиране поради ограниченията на FK.

Като алтернатива можете да използвате тригери, за да проверите дали стойностите са свързани чрез вътрешни съединения:

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

Отказ от отговорност:Не можах да тествам това на SqlFiddle и нямам инсталиран Oracle, но се надявам, че ще ви насочи в правилната посока.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Parallel Hint в Dynamic SQL на Oracle изпълнява ли се паралелно?

  2. Одитни пътеки на Oracle DB

  3. Oracle:Показване на номера на реда с клауза „подреждане по“.

  4. Oracle - зомби маса

  5. как да зададете колона за автоматично увеличение с sql разработчик