Обеспечить уникальность по подмножеству строк в таблице в БД Oracle



Для таблицы CARS с двумя столбцами MAKE и MODEL я хотел бы убедиться, что для некоторых конкретных значений MAKE их значения модели должны быть уникальными (предполагая, что это база данных Oracle).



Например, я хочу применить дубликаты для Ford, но не Toyota. Я не хочу больше одного ряда с моделью "F150" и маркой "Ford". Тем не менее, это нормально иметь два ряда с моделью "Rav4" и маркой "Toyota". Также нормально иметь ряд с моделью "F150" и "Форд" делают и еще один ряд с моделью "F150" и "Toyota" делают.



Я исследовал различные стратегии с триггерами, ограничениями или индексами, но пока не нашел ничего, что дало бы мне необходимый уровень контроля.

Спасибо!

461   2  

2 ответов:

Вы можете создать уникальный индекс на основе функций для обеспечения уникальности пар (make,model) только тогда, когда make= 'Ford':

create table cars (make varchar2(255) not null, model varchar2(255) not null);

create unique index ford_index on cars (
  case make 
  when 'Ford' then make
  else null
  end,
  case make 
  when 'Ford' then model
  else null
  end  );


insert into cars (make, model) values ('Ford', 'F150');
insert into cars (make, model) values ('Ford', 'Fiesta');
insert into cars (make, model) values ('Toyota', 'Camry');
insert into cars (make, model) values ('Toyota', 'Camry');
insert into cars (make, model) values ('Ford', 'F150'); --- FAILS with unique constraint violation

Индексы Ford_index (make, model) только в том случае, если make='Ford' - все остальное исключается из индекса и поэтому не подлежит ограничению уникальности.

Создайте материализованное представление с быстрым обновлением при фиксации. Определение MV может быть просто select make, model from <your_table> where make in (select make from <small_table>). В <small_table> будут перечислены марки, для которых вы хотите применить эту уникальность. А затем создайте уникальный индекс на (make, model) в материализованном представлении.

Всякий раз, когда дублирование предпринимается с помощью make 'Ford', MV будет обновляться при фиксации. Изменение в MV будет отклонено, что, в свою очередь, приведет к сбою исходного COMMIT.

Comments

    Ничего не найдено.