2012-03-20 4 views
4

Я пытаюсь создать ограничение на базу данных оракула, который говорит следующее:Создание ограничений нескольких столбцов в зависимости от значения столбца

Если column1 == someValue то комбинация column2 и column3 должен быть уникальным для всех записей с column1 == someValue

Я знаком с понятиями уникальных и контрольных ограничений, и я попытался выразить ограничение с этими конструкциями. Однако я не могу найти способ включить условие. Вот почему мне интересно, возможно ли это.

В таблице я хочу создать ограничение для создаются Hibernate отображения следующей иерархии классов (большинство атрибутов опущены для краткости):

class MyClass { 
    String name; 
    MyClass parent; 
} 

class MySubClass extends MyClass { 
    String businessValue; 
} 

классов сопоставляются с использованием единой стратегии таблицы и с использованием различными значения дискриминатора для каждого типа. Требование клиента состоит в том, что для всех экземпляров MySubClass комбинация имени и родителя должна быть уникальной (столбец1 будет значением дискриминатора). Было бы легко обеспечить такое ограничение для родительского класса через ограничение таблицы. Однако это ограничение должно применяться только к MySubClass.

Существует возможность проверки данных перед вводом их в базу данных с такими фреймворками, как Hibernate Validator. Но поскольку валидация потребует доступа к базе данных в любом случае, ограничение базы данных кажется более экономичным с точки зрения производительности.

+1

Я очень рад видеть разработчика ORM, оценивающего преимущества использования ограничений базы данных! –

ответ

5

Вы не можете сделать это с ограничением, но вы можете сделать это с помощью "function-based index" (ФБР), как это:

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

Это только создает записи уникальный индекс для строк с «SomeValue» COLUMN1 =, поэтому другие строки могут содержать дубликаты, но это невозможно.

+0

Эти случаи не полные или я чего-то не хватает? –

+0

@Florin, спасибо - sloppiness становится особенностью моих ответов в последнее время :-( –

+0

+1 хорошая техника сметы –

Смежные вопросы