簡體   English   中英

條件PostgreSQL外鍵

[英]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沒有條件外鍵。 您可能會考慮的一些選項是:

  1. 只是沒有FK約束。 將此邏輯移至數據訪問層並在沒有參照完整性的情況下生存。
  2. 在列中允許NULL ,即使使用FK約束也完全有效。 然后,使用另一列來存儲0-1的含義。
  3. 在引用的表中為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.

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