I’m trying to create a constraint on an oracle database that says the following:
If column1 == someValue then the combination of column2 and column3 has to be unique for all entries with column1 == someValue
I’m familiar with the concepts of unique and check constraints, and I’ve tried expressing the constraint with those constructs. However, I can’t seem to find a way to include the condition. Which is why I’m wondering if it is even possible.
The table I want to create constraint for is created by Hibernate mapping the following class hierarchy (most of the attributes ommited for brevity):
class MyClass {
String name;
MyClass parent;
}
class MySubClass extends MyClass {
String businessValue;
}
The classes are mapped using a single table strategy and using different discriminator values for each type. It’s a customer requirement that for all instances of MySubClass the combination of name and parent has to be unique (column1 would be the discriminator value). It would be easy to enforce such a constraint on the parent class through a table constraint. However, that constraint must only apply to MySubClass.
There is the possibility of validating the data before entering it into the the database with frameworks such as Hibernate Validator. But since the validation would need database access anyway, a database constraint seems the more performance saving way to do it.
You can’t do this with a constraint, but you can do it using a “function-based index” (FBI) like this:
This only creates unique index entries for rows with column1 = ‘somevalue’, so other rows can contain duplicates but these cannot.