今天在开发过程中遇到了需要两个字段联合保证唯一性,所以查阅了一些资料和博客,梳理一下以便之后用到!!!

  首先,你要搞明白什么是唯一索引和唯一约束,其次它们之间的区别是什么?

前提

二者的定义

 唯一索引:一种索引,不允许具有索引值相同的行,从而禁止重复的索引或键值。系统在创建该索引时检查是否有重复的键值,并在每次使用 INSERT 或 UPDATE 语句添加数据时进行检查。     

 唯一约束:唯一约束保证在一个字段或者一组字段里的数据与表中其它行的数据相比是唯一的(联合字段中,可以包含空值。)   

备注:在Oracle中,唯一约束最多可以有32列。唯一约束可以在创建表时或使用ALTER TABLE语句创建

二者的区别

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

目标

    接下来该干正事了,怎么创建联合索引保证唯一性!!!

--示例表
CREATE TABLE BIZ_PERSON(
  VARCHAR2(32) primary key ,
  NAME VARCHAR2(32) ,
  AGE  VARCHAR2(32)
);

--创建两个字段唯一索引,此时已能保证数据的唯一性
CREATE UNIQUE INDEX UNIQUE_AGE_NAME ON 
BIZ_PERSON(NVL2(NAME,AGE,NULL),NVL2(NAME,NAME,NULL));

--如何查询当前表的索引和约束?
--查询索引
SELECT 
b.uniqueness, 
a.index_name, 
a.table_name, 
a.column_name 
FROM all_ind_columns a, all_indexes b
WHERE a.index_name=b.index_name AND a.table_name = upper('BIZ_PERSON')
--查询约束
SELECT * FROM all_constraints WHERE table_name='BIZ_PERSON';
 
--删除 唯一索引
drop index UNIQUE_AGE_NAME;
--删除 唯一约束
ALTER TABLE BIZ_PERSON DROP CONSTRAINT 约束名称;
 

知识点扩展

NULL指的是空值,或者非法值。
NVL (expr1, expr2)->expr1为NULL,返回expr2;不为NULL,返回expr1。注意两者的类型要一致
NVL2 (expr1, expr2, expr3) ->expr1不为NULL,返回expr2;为NULL,返回expr3。expr2和expr3类型不同的话,expr3会转换为expr2的类型
NULLIF (expr1, expr2) ->相等返回NULL,不等返回expr1

参考资料

唯一索引_百度百科 (baidu.com)   

唯一约束_百度百科 (baidu.com)                                                  

(3条消息) oracle的联合约束(多个字段的唯一性)_sqiucheng的专栏-CSDN博客

   

    

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐