[英]Conditional PostgreSQL foreign key
在PostgreSQL中有可能有條件地添加外鍵嗎?
類似於: ALTER TABLE table1 ADD FOREIGN KEY (some_id) REFERENCES other_table WHERE some_id NOT IN (0,-1) AND some_id IS NOT NULL;
具體來說,我的引用表具有所有正整數(1+),但我需要添加外鍵的表可以包含零(0),空和負一(-1),所有這些都意味着不同的東西。
筆記:
我完全清楚這是一個糟糕的桌面設計 ,但它是10多年前建立的一個聰明的技巧,當時我們現有的功能和資源都不存在。 這個系統正在運行數百個零售店,所以要回去並且此時改變方法可能需要幾個月我們沒有。
我不能使用觸發器, 這必須用外鍵完成 。
簡短的回答是不,Postgres沒有條件外鍵。 您可能會考慮的一些選項是:
NULL
,即使使用FK約束也完全有效。 然后,使用另一列來存儲0
和-1
的含義。 0
和-1
添加一個虛擬行。 即使它只是偽造數據,它也會滿足FK約束。 希望這可以幫助!
您的要求等同於此檢查約束:
create table t (a float check (a >= -1 and a = floor(a) or a is null));
您可以向table1
添加另一個“shadow”列,其中包含已清理的值(即除了0
和-1
所有值)。 使用此列進行參照完整性檢查。 此影子列由table1
上的簡單觸發器更新/填充,該觸發器將除0
和-1
所有值寫入影子列。 0
和-1
都可以映射為null
。
然后,您具有參考完整性和未更改的原始列。 缺點:你還有一點觸發器和一些冗余數據。 但唉,這是傳統架構的命運!
您可以使用檢查約束和外鍵來實現此功能。
CREATE TABLE table1 (some_id INT, some_id_fkey INT REFERENCES other_table(other_id), CHECK (some_id IN (0,-1) OR some_id IS NOT DISTINCT FROM some_id_fkey));
(未測試)
這是另一種可能性。 使用PG繼承強制表的分區在標志列中具有+1,否則。 (用於維護此操作的常用規則/觸發器。)然后,僅在Has_PLUS_ONE子表和引用的表之間具有FK關系。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.