加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Oracle主键、唯一索引和唯一约束的区别及示例

(2018-10-17 17:37:02)
标签:

oracle主键

oracle唯一约束

oracle唯一索引

分类: Oracle数据库
   在日常大数据处理过程中,主键、唯一约束和唯一索引的经常会被混淆,为了清楚地了解这三个概念,下面我们来看下三者的区别吧。

一、三者的定义
主键:唯一标识表中的每一条记录,可以定义一列或多列为主键,主键列上没有任何两行相同的值(即重复值),同时主键列上不能有空值。
唯一索引:不允许具有索引值相同的行,从而禁止重复的索引或键值。
唯一约束:指表中一个字段或者多个字段联合起来能够唯一标识一条记录的约束。联合字段中,可以包含空值。
备注:在Oracle中,唯一约束最多可以有32列。唯一约束可以在创建表时或使用ALTER TABLE语句创建。

二、唯一约束和主键的区别
1、唯一约束允许在该列上存在NULL值,而主键约束的限制更为严格,不但不允许有重复,而且也不允许有空值。
2、在创建唯一约束和主键约束时可以创建聚集索引和非聚集索引,但在 默认情况下主键约束产生聚集索引,而唯一约束产生非聚集索引。

约束和索引,前者是用来检查数据的正确性,后者用来实现数据查询的优化,目的不同。
唯一约束与唯一索引有所不同:
1、创建唯一约束会在Oracle中创建一个Constraint,同时也会创建一个该约束对应的唯一索引。
2、创建唯一索引只会创建一个唯一索引,不会创建Constraint。
也就是说其实唯一约束是通过创建唯一索引来实现的。
在删除时这两者也有一定的区别:
删除唯一约束时可以只删除约束而不删除对应的索引,所以对应的列还是必须唯一的,而删除了唯一索引的话就列就没有唯一约束了,此时可以插入不唯一的值。

三、示例说明
1、主键约束的创建/禁用/删除
--创建主键约束
可以在创建表时指定列为主键,也可以通过下面语句创建:
alter table table_name add constraint pk_clo_name primary key(column_name);

--禁用主键约束
alter table table_name disable constraint pk_clo_name;

--删掉主键约束
alter table table_name drop constraint pk_clo_name;

2、唯一约束的创建/禁用/删除
--创建基于多列的唯一约束
alter table my_test add constraint con_uni_my_test unique(staff_id,first_name,last_name)
备注:创建该约束后,staff_id,first_name,last_name不能同时相等。

示例1:基于单列的唯一约束
alter table my_test
add constraint con_uni_my_test1
unique(user_id);

示例2:基于多列的唯一约束
alter table my_test
add constraint con_uni_my_test2
unique(prod_id,prod_name);

--禁用唯一约束
语法:
alter table table_name
disable constraint constraint_name;

示例:
alter table my_test
disable constraint con_uni_my_test1;

--删除唯一约束
alter table my_test drop constraint con_uni_my_test1;

3、唯一索引的创建/删除
-- 创建唯一索引
create unique index idx_my_test_tid on my_test(tid);

--删除唯一索引
drop index idx_my_test_tid;

四、字典表中查询索引约束信息
--查询表索引情况
select * from user_indexes where table_name=upper('my_test');
select * from user_ind_columns where table_name=upper('my_test');

--查询表约束情况
select * from user_constraints where table_name=upper('my_test');
select * from user_cons_columns where table_name=upper('my_test');

五、总结
1、主键约束要求列值非空,而唯一约束和唯一索引不要求列值非空,都不能有重复数据。
2、主键约束和唯一约束会隐式创建同名的唯一索引,当主键约束或者唯一约束失效或被删除时,隐式创建的唯一性索引也会被删除。
3、相同字段列不允许重复创建索引。



本文参考资料:
http://blog.itpub.net/30557618/viewspace-1833882/
https://blog.csdn.net/u011278012/article/details/51940709

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有