[英]Exclusion constraint across two tables
我有兩個表存儲兩個不同應用程序實體的數據。 兩個實體都有一些公共字段,特別是父實體的外鍵和日期范圍字段。 我可以在每個表上創建一個排除約束,以確保同一父實體的日期范圍不重疊,但我需要將此約束應用於兩個組合的表。 有沒有辦法可以在數據庫級別實現這一點?
我以為我可以創建一個僅包含 parent_id 和 daterange 列以及排除約束的附加表,並在插入/更新/刪除行時在上述兩個表上添加觸發器,但如果有的話,我對更簡單的解決方案感興趣一!
如果您希望設計保持當前狀態,那么帶觸發器的解決方案可能是唯一的解決方案。
如果你願意重新設計,你可以 model 這樣的數據:
-- for the exclusion constraint
CREATE EXTENSION btree_gist;
CREATE TABLE parent (
pid bigint PRIMARY KEY GENERATED ALWAYS AS IDENTITY
);
CREATE TABLE ranges (
rid bigint NOT NULL GENERATED ALWAYS AS IDENTITY,
pid bigint NOT NULL REFERENCES parent (pid),
arange daterange NOT NULL,
PRIMARY KEY (pid, rid),
EXCLUDE USING gist (pid WITH =, arange WITH &&)
);
CREATE TABLE child1 (
c1id bigint PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
pid bigint NOT NULL REFERENCES parent (pid),
rid bigint NOT NULL,
FOREIGN KEY (rid, pid) REFERENCES ranges (rid, pid)
);
CREATE TABLE child2 (
c2id bigint PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
pid bigint NOT NULL REFERENCES parent (pid),
rid bigint NOT NULL,
FOREIGN KEY (rid, pid) REFERENCES ranges (rid, pid)
);
也就是說,將所有范圍保留在一個表中,以便您可以定義排除約束。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.