sql - 强制 Oracle DB 中表的行子集具有唯一性

标签 sql oracle database-trigger database-indexes

对于具有两列 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/

相关文章:

sql - 一对多关系的最大约束 - Oracle SQL

sql - 以编程方式重命名所有系统名称约束

sql - Oracle - 在禁用状态下添加外部约束?

database - 如何远程导出oracle数据库?

java - 通过java连接oracle 10g Express版的问题

sql - 创建 postgresql 触发器或函数以从一个表中删除旧数据并插入到别名表中

php - 如何按降序对 id 和 sub_id 进行排序?

sql - t-sql 将日期分配给学年

sql - NoSQL 的用例

sql - 使用 PostgreSQL 更新只读列时引发异常