Обеспечить уникальность по подмножеству строк в таблице в БД Oracle
Для таблицы CARS с двумя столбцами MAKE и MODEL я хотел бы убедиться, что для некоторых конкретных значений MAKE их значения модели должны быть уникальными (предполагая, что это база данных Oracle).
Например, я хочу применить дубликаты для Ford, но не Toyota. Я не хочу больше одного ряда с моделью "F150" и маркой "Ford". Тем не менее, это нормально иметь два ряда с моделью "Rav4" и маркой "Toyota". Также нормально иметь ряд с моделью "F150" и "Форд" делают и еще один ряд с моделью "F150" и "Toyota" делают.
Я исследовал различные стратегии с триггерами, ограничениями или индексами, но пока не нашел ничего, что дало бы мне необходимый уровень контроля.
Спасибо!
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