簡體   English   中英

跨兩個表的排除約束

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM