Postgresql
two-table-over <+> 函式關係:維護引用完整性
我有三個表,最後兩個與第一個具有多對一關係,用 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)
您在treatment
和visit
表上添加(冗餘)唯一約束。然後讓外鍵通過包含到各自的外鍵中來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);