Postgresql

我可以在postgresql中對父母和孩子都有一個外鍵嗎?

  • October 29, 2014

我想要一個引用表的外鍵**,**它是孩子。這是我嘗試和失敗的方式:

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);

然後更改您的parentchild,使它們的主鍵也是引用此表的外鍵:

CREATE TABLE parent (
   id integer PRIMARY KEY REFERENCES common (id),
   ...
);

同樣,任何同時引用和的表 應該引用 to 。parent``child``common

當然,這意味著您必須更改將數據插入parent和的邏輯child。這意味著一個額外的INSERT- 它可以是 的一部分function used for insertion,可以是您的 atrigger procedure或普通INSERTapplication code,這一切都取決於您現有的方法。

引用自:https://dba.stackexchange.com/questions/81274