在 Oracle DB 中对 Table 上的行子集强制执行唯一性
Enforce Uniqueness on a Subset of Rows on Table in Oracle DB
对于 table,CARS,有两列,MAKE 和 MODEL,我想强制要求对于某些特定的 MAKE 值,它们的 MODEL 值必须是唯一的(假设这是一个 Oracle 数据库) .
例如,我想为福特强制执行重复项,而不是丰田。我不希望 'F150' MODEL 和 'Ford' MAKE 超过一行。但是,'Rav4' MODEL 和 'Toyota' MAKE 可以有两行。也可以用 'F150' 模型和 'Ford' 制造一行,另一行用 'F150' 模型和 'Toyota' 制造。
我一直在研究各种带有触发器、约束或索引的策略,但我还没有找到任何可以给我所需控制级别的东西。
谢谢!
创建实体化视图,提交时快速刷新。 MV 定义可能只是 select make, model from <your_table> where make in (select make from <small_table>)
。 <small_table>
将列出您要为其强制执行此唯一性的品牌。然后在实体化视图中的 (make, model)
上创建一个唯一索引。
每当尝试使用 make 'Ford'
进行复制时,MV 将在提交时刷新。 MV中的改动会被拒绝,进而导致原来的COMMIT
失败
您可以创建一个基于函数的唯一索引,以仅在 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='Ford' 时才索引 (make, model) - 其他所有内容都被排除在索引之外,因此不受唯一性约束的约束。
对于 table,CARS,有两列,MAKE 和 MODEL,我想强制要求对于某些特定的 MAKE 值,它们的 MODEL 值必须是唯一的(假设这是一个 Oracle 数据库) .
例如,我想为福特强制执行重复项,而不是丰田。我不希望 'F150' MODEL 和 'Ford' MAKE 超过一行。但是,'Rav4' MODEL 和 'Toyota' MAKE 可以有两行。也可以用 'F150' 模型和 'Ford' 制造一行,另一行用 'F150' 模型和 'Toyota' 制造。
我一直在研究各种带有触发器、约束或索引的策略,但我还没有找到任何可以给我所需控制级别的东西。
谢谢!
创建实体化视图,提交时快速刷新。 MV 定义可能只是 select make, model from <your_table> where make in (select make from <small_table>)
。 <small_table>
将列出您要为其强制执行此唯一性的品牌。然后在实体化视图中的 (make, model)
上创建一个唯一索引。
每当尝试使用 make 'Ford'
进行复制时,MV 将在提交时刷新。 MV中的改动会被拒绝,进而导致原来的COMMIT
失败
您可以创建一个基于函数的唯一索引,以仅在 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='Ford' 时才索引 (make, model) - 其他所有内容都被排除在索引之外,因此不受唯一性约束的约束。