2009-08-21 41 views
1

我有一種情況,其(簡體)看起來是這樣的:Oracle:兩個表結合的FK?

  • 表單位對UNITS.NAME一個PK。 (單元名稱,varchar(12))
  • 表DEPTS在DEPTS.NAME上有一個PK。 (部門名稱,VARCHAR(12))

  • 我想創建一個UNIT_NAME_OR_DEPT_NAME列的表,與 的要求,即在此列中的數據必須是一個有效的單元 名稱或有效的部門名稱。

我嘗試添加兩個FK約束,卻發現這給我的 交集,而不是兩個表的聯合。

CONSTRAINT FOO_FK1 FOREIGN KEY(NAME) REFERENCES UNITS(NAME) ENABLE, 
CONSTRAINT FOO_FK2 FOREIGN KEY(NAME) REFERENCES DEPTS(NAME) ENABLE, 

如何創建一個FK或其他約束,將我引用 兩個表的工會嗎?

回答

1

我會去有兩個隱藏的列units_fkdept_fk適當FK約束和其它附加CHECK CONSTRAINT,例如,如果僞列是必需的:

CONSTRAINT chk_units_dept_fk CHECK 
    (units_fk IS NULL AND dept_fk IS NOT NULL) 
OR (units_fk IS NOT NULL AND dept_fk IS NULL) 

然後,您可以在視圖中添加陰影列

CREATE VIEW my_view AS 
SELECT col1,...coln, nvl(units_fk, dept_fk) as UNIT_NAME_OR_DEPT_NAME 
    FROM my_table 

您可以處理或者與程序(我的選擇)或INSTEAD OF TRIGGER僞列的更新。

+0

謝謝...順便說一句,愛你的圖標。檢查我的個人資料,你會看到爲什麼。 :-) – 2009-08-23 23:39:37

+0

@Mark:我是一個很棒的粉絲:p – 2009-08-24 13:25:20

1

爲什麼你想要一列指向兩個不同的表?爲什麼不是許多關係中的兩個不同的列?在允許插入之前,您可能必須使用觸發器來檢查是否至少有一個不爲空。

+1

您不應該使用單個列來保存兩種不同類型的數據。如果你得到一個與部門同名的單位會發生什麼?如果他們不能,那麼你有一個名稱作爲主鍵/候選鍵和一個屬性,指明它是一個單位還是部門,並且這應該是父表。 – 2009-08-21 03:30:52

+0

您可以使用簡單的檢查約束來強制只有一列具有設置的值。而且,如果出於任何原因想要將它們視爲單個列,則可以使用NVL(UNIT,DEPT)的視圖。 – 2009-08-21 03:32:01

0

我想我會做到這一點:

有一個名爲 「MasterKey」(或其他)序列。

有第三張名爲「SequencesUsed」的表或者只有一列的東西 - 使用MasterKey中的值。在單位表和部門表中創建新記錄時,在sequenUsed表中觸發新記錄,並將生成的值作爲foriegn鍵輸入相應的表中。

你的新表將有一個名爲「dept_or_unit_id」的字段,它具有SequencesUsed表,因爲它是外鍵。

因此,像這樣:

MasterKey:柱:ID值:1,2,3,4, 單位:柱:姓名,masterkey值:FOO,1;酒吧,3; 部門:專欄:名字,masterkey。值:1,2;星星,4; NewTable:column:masterkey值:1,2,3,4 4

根據您使用數據的方式,可能有一種方法可以改善這一點,但看起來連接會比晚些時候更容易如果你在兩個地方有一個場點。