我正在尝试在oracle数据库上创建一个约束如下:
如果column1 == someValue
,那么column2
和column3
的组合必须对于column1 == someValue
我熟悉unique和check约束的概念,我尝试用这些结构表达约束。但是,我似乎找不到包含条件的方法。这就是为什么我想知道它是否可能。
我想要创建约束的表是由Hibernate映射以下类层次结构创建的(为简洁起见,大多数属性都被忽略):
class MyClass {
String name;
MyClass parent;
}
class MySubClass extends MyClass {
String businessValue;
}
使用单个表策略映射类,并为每种类型使用不同的鉴别器值。客户要求对于MySubClass
的所有实例,name和parent的组合必须是唯一的(column1将是鉴别器值)。通过表约束在父类上强制执行这样的约束会很容易。但是,该约束必须仅适用于MySubClass
。
在使用Hibernate Validator等框架将数据输入数据库之前,可以验证数据。但是,由于验证无论如何都需要数据库访问,因此数据库约束似乎是更节省性能的方法。
答案 0 :(得分: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
);
这只为column1 ='somevalue'的行创建唯一索引条目,因此其他行可以包含重复项,但这些不能包含重复项。