2014-06-23 34 views
14

我有三個表格:organization,organization_teamsorg_users。這裏organization_teamsorganization繼承。因此,假設如果在organizations_teams中添加記錄,則將獲得organizationid作爲id列的值organization_teamsPostgreSQL中的外鍵+表繼承?

org_usersid列的外鍵organization。現在當我試圖插入數據在org_users它給我錯誤如下

insert or update on table "org_users" violates foreign key constraint "org_users_organizations" 
DETAIL: Key (org_id)=(12) is not present in table "organizations" 

爲什麼?

+0

序列號不是遺傳的。 – frlan

+2

這是已知的警告:*繼承特性的嚴重限制是索引(包括唯一約束)和外鍵約束僅適用於單個表,而不適用於它們的繼承子* http://www.postgresql.org/docs/ current/static/ddl-inherit.html#DDL-INHERIT-CAVEATS – pozs

+0

我已經在組織表中有一些組織,在organization_teams中有一些組織,因此org_user在組織中有外鍵。 –

回答

22

這是covered in the user manual

簡短版本:您可以使用外鍵或表繼承,但不能同時使用。這並非不可能,只是在技術上很難以快速,可靠的方式實現跨PostgreSQL中的繼承表的獨特索引。沒有這一點,你不能有一個有用的外鍵。沒有人成功實施它,以便補丁添加支持,以便被PostgreSQL接受。

外鍵可以指向屬於繼承層次結構的表的一個表,但它只能在該表中找到行,正好是。不在任何父表或子表中。要查看外鍵看到的行,請執行SELECT * FROM ONLY thetableONLY關鍵字的意思是「忽略繼承」,這就是外鍵查找所要做的。

+0

僅在表繼承層次結構的「葉」表上應用外鍵纔是'安全'嗎? –

+0

@AndrewWolfe如果引用表和引用表使用同一個鍵進行分區,則可以在相應分區之間使用FK。這就是所有。 –

0

我已經找到了唯一的解決方法是:

  1. 創建功能在繼承表
  2. 檢查一些ID 存在返回觸發創建約束觸發,而不是FK