对于具有两列 MAKE 和 MODEL 的表 CARS,我想强制要求对于某些特定的 MAKE 值,它们的 MODEL 值必须是唯一的(假设这是 Oracle 数据库)。
例如,我想对福特强制执行重复项,但不想对丰田强制执行重复项。我不想多于一排带有“F150”型号和“Ford”品牌的产品。然而,“Rav4”型号和“丰田”品牌的两排是可以的。也可以将“F150”型号和“Ford”品牌排成一排,将“F150”型号和“Toyota”品牌排成另一排。
我一直在研究带有触发器、约束或索引的各种策略,但我还没有找到任何可以给我所需控制级别的东西。
谢谢!
最佳答案
仅当 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 才会索引(品牌、型号) - 其他所有内容都被排除在索引之外,因此不受唯一性约束。
关于sql - 强制 Oracle DB 中表的行子集具有唯一性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44808665/