2012-03-20 85 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