2012-03-20 25 views
4

我試圖創建一個Oracle數據庫的約束,上面寫着以下內容:創建多列約束,具體取決於列值

如果column1 == someValue那麼column2column3組合必須與所有項獨特column1 == someValue

我熟悉獨特和檢查約束的概念,我試着用這些結構表達約束。但是,我似乎無法找到一種方法來包含這種情況。這就是爲什麼我想知道這是否可能。

我想創建約束爲的是Hibernate創建映射下面的類層次結構表(大部分中省略了簡潔的屬性):

class MyClass { 
    String name; 
    MyClass parent; 
} 

class MySubClass extends MyClass { 
    String businessValue; 
} 

類是使用一個表的策略,並使用不同的映射每種類型的鑑別器值。客戶要求對於MySubClass的所有實例,名稱和父項的組合必須是唯一的(第1列將是鑑別器值)。通過表約束可以很容易地對父類實施這樣的約束。但是,該限制僅適用於MySubClass

在使用Hibernate Validator等框架將數據輸入數據庫之前,有可能驗證數據。但是由於無論如何驗證都需要數據庫訪問,所以數據庫約束似乎是更好的性能節省方式。

+1

我很高興看到一位ORM開發者意識到使用數據庫約束的好處! – 2012-03-20 14:01:39

回答

5

你不能約束做到這一點,但您可以在使用"function-based index"(FBI)是這樣做的:

create unique index mytable_idx on mytable 
    (case when column1 = 'somevalue' then column2 end 
    , case when column1 = 'somevalue' then column3 end 
    ); 

這將創建與列1 =「someValue中」行唯一索引條目,所以其他行可以包含重複項,但這些不能。

+0

這些案件不完整或我錯過了什麼? – 2012-03-20 15:15:03

+0

@弗洛林,謝謝 - sloppiness最近成爲我的答案的一個特點:-( – 2012-03-20 15:18:13

+0

+1良好的約束技術 – 2012-03-20 15:34:56