Postgresql

two-table-over <+> 函式關係:維護引用完整性

  • August 30, 2019

我有三個表,最後兩個與第一個具有多對一關係,用 SQL 寫在這裡:

create table study (
   id bigint primary key,
   name text
);

create table treatment (
   id bigint primary key,
   name text,
   study_id bigint references study
);

create table visit (
   id bigint primary key,
   name text,
   study_id bigint references study
);

這些被匯集到一個會話中,該會話將在某些研究中分配治療的人聯繫起來,如下所示:

create table session (
   id bigint primary key,
   person_id bigint references person,
   study_id bigint references study,
   visit_id bigint references visit,
   treatment_id bigint references treatment
);

確保對於會話表中的任何行,study_id、visit_id 和treatment_id 都屬於同一個研究的最佳方法是什麼?我在 Postgres 9.x 數據庫中工作。檢查約束不能引用其他表,所以可能是插入和更新之前的觸發器?

(study_id, id)您在treatmentvisit表上添加(冗餘)唯一約束。然後讓外鍵通過包含到各自的外鍵中來session引用這些唯一的約束。study_id

那麼你的條件就會自動得到滿足。

唯一約束並不像看起來那麼多餘,因為study_id無論如何都應該索引外鍵約束。

將其放入 SQL 中:

ALTER TABLE treatment
  ADD UNIQUE (study_id, id);

ALTER TABLE visit
  ADD UNIQUE (study_id, id);

ALTER TABLE session
  DROP CONSTRAINT session_treatment_id_fkey,
  DROP CONSTRAINT session_visit_id_fkey,
  ADD FOREIGN KEY (study_id, treatment_id) REFERENCES treatment (study_id, id),
  ADD FOREIGN KEY (study_id, visit_id) REFERENCES visit (study_id, id);

引用自:https://dba.stackexchange.com/questions/246588