首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对Oracle DB中的表的行子集强制唯一性

对Oracle DB中的表的行子集强制唯一性
EN

Stack Overflow用户
提问于 2017-06-29 01:04:14
回答 2查看 424关注 0票数 2

对于包含两列MAKE和MODEL的CARS表,我想强制要求对于某些特定的MAKE值,它们的MODEL值必须是唯一的(假设这是一个Oracle数据库)。

例如,我希望对福特强制执行重复操作,但不对丰田强制执行。我不想让'F150‘车型和’福特‘品牌有多个行。然而,这是可以有两行与'Rav4‘模型和’丰田‘制造。与“F150”车型和“福特”车型发生争执,与“F150”车型和“丰田”车型发生争执,也是可以的。

我一直在研究使用触发器、约束或索引的各种策略,但我还没有找到任何可以给我提供所需控制级别的东西。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-29 02:09:27

您可以创建一个唯一的基于函数的索引,仅当make=‘Ford’时才强制(make,model)对的唯一性:

代码语言:javascript
复制
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,型号)-其他所有内容都会被排除在索引之外,因此不受唯一性约束的约束。

票数 2
EN

Stack Overflow用户

发布于 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失败。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44808665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档