对于包含两列MAKE和MODEL的CARS表,我想强制要求对于某些特定的MAKE值,它们的MODEL值必须是唯一的(假设这是一个Oracle数据库)。
例如,我希望对福特强制执行重复操作,但不对丰田强制执行。我不想让'F150‘车型和’福特‘品牌有多个行。然而,这是可以有两行与'Rav4‘模型和’丰田‘制造。与“F150”车型和“福特”车型发生争执,与“F150”车型和“丰田”车型发生争执,也是可以的。
我一直在研究使用触发器、约束或索引的各种策略,但我还没有找到任何可以给我提供所需控制级别的东西。
谢谢!
发布于 2017-06-29 02:09:27
您可以创建一个唯一的基于函数的索引,仅当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只有当ford_index =‘福特’时,make才会索引(make,型号)-其他所有内容都会被排除在索引之外,因此不受唯一性约束的约束。
发布于 2017-06-29 01:08:20
创建实体化视图,并在提交时快速刷新。MV的定义可以是简单的select make, model from <your_table> where make in (select make from <small_table>)。<small_table>将列出您要强制执行此唯一性的品牌。然后在物化视图中的(make, model)上创建唯一索引。
每当尝试使用make 'Ford'进行复制时,MV都会在提交时刷新。MV中的更改将被拒绝,这将导致原始COMMIT失败。
https://stackoverflow.com/questions/44808665
复制相似问题