在Oracle DB中的表上行的子集上实施唯一性

时间:2017-06-28 17:04:14

标签: sql oracle database-trigger database-indexes

对于一个表,CARS,有两列,MAKE和MODEL,我想强制说,对于某些特定的MAKE值,它们的MODEL值必须是唯一的(假设这是一个Oracle数据库)。

例如,我想为福特强制执行重复,而不是丰田。对于' F150'我不想要多行。 MODEL和' Ford'使。但是,有两行可以使用' Rav4' MODEL和丰田'使。也可以选择' F150' MODEL和' Ford'使用' F150'制作另一排MODEL和丰田'使。

我一直在研究各种具有触发器,约束或索引的策略,但我还没有发现任何可以提供我所需控制级别的任何策略。

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以创建一个基于函数的唯一索引,以便仅在make ='Ford'时强制(make,model)对的唯一性:

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
仅当make ='Ford'时,

ford_index索引(make,model) - 其他所有内容都不在索引之外,因此不受唯一性约束的约束。

答案 1 :(得分:0)

创建实体化视图,并在提交时快速刷新。 MV定义可能只是select make, model from <your_table> where make in (select make from <small_table>)<small_table>将列出您要强制执行此唯一性的品牌。然后在物化视图中的(make, model)上创建一个唯一索引。

每当使用make 'Ford'尝试重复时,MV将在提交时刷新。 MV中的更改将被拒绝,这反过来将导致原始COMMIT失败。

相关问题