Создание ограничений на несколько столбцов в зависимости от значения столбца - PullRequest
4 голосов
/ 20 марта 2012

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

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

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

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

class MyClass {
     String name;
     MyClass parent;
}

class MySubClass extends MyClass {
     String businessValue;
}

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

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

1 Ответ

5 голосов
/ 20 марта 2012

Вы не можете сделать это с ограничением, но вы можете сделать это, используя «индекс на основе функций» (ФБР), подобный этому:

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

Это только создаетуникальные записи индекса для строк с column1 = 'somevalue', поэтому другие строки могут содержать дубликаты, но они не могут.

...