2012-11-05 126 views
3

我想在表A上創建一個約束來檢查表B中是否存在一組記錄。我可以使用一個外鍵,但問題是表B中的數據是非實際的,獨特。非唯一索引中的外鍵? (oracle)

有沒有辦法在不創建觸發器的情況下創建這樣的約束?

編輯:我不能改變表B結構。

+0

它不是SQL標準......外鍵必須指向唯一記錄,方法是引用父表上的主鍵或唯一鍵... –

+1

看起來您缺少模型中的表(主鍵將成爲此列的表) –

回答

3

一種技術是使用物化視圖(快速刷新提交)來存儲引用列的唯一值,並根據該列限制您的表。

嘗試使用觸發器來強制執行完整性通常由於讀取一致性或鎖定問題而註定要失敗。

0

我很確定強制執行這種關係的唯一方法是觸發器。

正如你所說,表B中的數據是非唯一的,所以外鍵不起作用。 (也Can a foreign key reference a non-unique index?見)

CHECK約束浮現在腦海中,但因爲他們不會在這裏工作:

  1. 不能引用其他表
  2. 不能包含子查詢。

這就是說,有可能是,在表B中的數據不是唯一的原因是,它是不被標準化。可能值得檢查一下您的模式,看看是否可以使用中間表提取A和B之間的唯一關係。

4

外鍵是1:N的關係。在約束的引用末尾只能有一個父記錄。這就是爲什麼我們只能建立引用唯一鍵的外鍵約束。

您似乎想要一個M:N的約束。這不適合關係模型。也許你需要的是一個交叉表(AB),它將表A中的許多記錄與表B中的許多記錄鏈接起來?事實上,根據您的實際要求,可能會有幾種不同的建模解決方案。

觸發器不起作用,部分原因是它們不能達到規模,但主要是因爲它們不能在多用戶環境中工作。

+0

謝謝您的回覆。我添加了一條解釋說明我無法更改表B結構的評論。 –