Postgresql
我可以在postgresql中對父母和孩子都有一個外鍵嗎?
我想要一個引用表的外鍵**,**它是孩子。這是我嘗試和失敗的方式:
CREATE TABLE parent ( id serial, CONSTRAINT parent_pk PRIMARY KEY(id) ); CREATE TABLE child ( val text, constraint child_pk PRIMARY KEY(id) ) INHERITS(parent); CREATE TABLE test ( id serial, foreign_id bigint REFERENCES parent(id), constraint testpk PRIMARY KEY (id) )
假設我們有這樣的數據:
parent: |id| +--+ |1 | --public.parent oid |2 | --public.child oid child: |id|val| +--+---+ |2 |'a'| --public.child oid
我想要實現的是:
test: |id|foreign_id| +--+----------+ |1 | 1 | --(from public.parent table) |2 | 2 | --(from public.child table)
這裡有一個好的解決方法嗎?
這是不可能的。PostgreSQL 中的繼承基於單個表,這些表僅通過 pg_inherit 進行邏輯連接。每個表仍然有些獨立。因此,您不能在整個結構上創建密鑰。只能引用單個表。但是,您可以做的是編寫一個確保完整性的觸發器。無論如何,外鍵在幕後基本相同。
您還可以做的是設置一個只儲存 ID 的表:
CREATE TABLE common (id serial PRIMARY KEY);
然後更改您的
parent
和child
,使它們的主鍵也是引用此表的外鍵:CREATE TABLE parent ( id integer PRIMARY KEY REFERENCES common (id), ... );
同樣,任何同時引用和的表都 應該引用 to 。
parent``child``common
當然,這意味著您必須更改將數據插入
parent
和的邏輯child
。這意味著一個額外的INSERT
- 它可以是 的一部分function used for insertion
,可以是您的 atrigger procedure
或普通INSERT
的application code
,這一切都取決於您現有的方法。