对于一个表,CARS,有两列,MAKE和MODEL,我想强制说,对于某些特定的MAKE值,它们的MODEL值必须是唯一的(假设这是一个Oracle数据库)。
例如,我想为福特强制执行重复,而不是丰田。对于' F150'我不想要多行。 MODEL和' Ford'使。但是,有两行可以使用' Rav4' MODEL和丰田'使。也可以选择' F150' MODEL和' Ford'使用' F150'制作另一排MODEL和丰田'使。
我一直在研究各种具有触发器,约束或索引的策略,但我还没有发现任何可以提供我所需控制级别的任何策略。
谢谢!
答案 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
失败。