一般,我们看到术语“索引”和“键”交换使用,但实际上这两个是不同的。索引是存储在数据库中的一个物理结构,键纯粹是一个逻辑概念。键代表创建来实施业务规则的完整性约束。索引和键的混淆通常是由于数据库使用索引来实施完整性约束。

接下来我们看看数据库中的主键约束、唯一键约束和唯一索引的区别。

SQL> select * from v$version;

BANNER

--------------------------------------------------------------------------------

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

PL/SQL Release 11.2.0.1.0 - Production

CORE    11.2.0.1.0      Production

TNS for Linux: Version 11.2.0.1.0 - Production

NLSRTL Version 11.2.0.1.0 - Production

SQL> create table test (

2  id int,

3  name varchar2(20),

4  constraint pk_test primary key(id))

5  tablespace users;

Table created.

SQL> select constraint_name, constraint_type from user_constraints;

CONSTRAINT_NAME                C

------------------------------ -

PK_TEST                        P

在test表中,我们指定了ID列作为主键,Oracle数据库会自动创建一个同名的唯一索引:

SQL> select index_name, index_type, uniqueness, tablespace_name

2  from user_indexes

3  where table_owner='SCOTT'

4  and table_name = 'TEST';

INDEX_NAME           INDEX_TYPE           UNIQUENES TABLESPACE_NAME

-------------------- -------------------- --------- ------------------------------

PK_TEST              NORMAL               UNIQUE    USERS

此时,如果我们再试图在ID列上创建一个唯一索引,Oracle会报错,因为该列上已经存在一个唯一索引:

SQL> create unique index idx_test_uk on test(id);

create unique index idx_test_uk on test(id)

*

ERROR at line 1:

ORA-01408: such column list already indexed

即使创建非唯一索引也不行:

SQL> create index idx_test_id on test(id);

create index idx_test_id on test(id)

*

ERROR at line 1:

ORA-01408: such column list already indexed

那么唯一键约束的情况是怎样的呢?

SQL> drop table test purge;

Table dropped.

SQL> create table test(

2  id int,

3  name varchar2(20),

4  constraint uk_test unique(id));

Table created.

SQL> select constraint_name, constraint_type from user_constraints;

CONSTRAINT_NAME                C

------------------------------ -

UK_TEST                        U

查看此时的索引情况:

SQL> select index_name, index_type, uniqueness, tablespace_name

2  from user_indexes

3  where table_owner='SCOTT'

4  and table_name = 'TEST';

INDEX_NAME           INDEX_TYPE           UNIQUENES TABLESPACE_NAME

-------------------- -------------------- --------- ------------------------------

UK_TEST              NORMAL               UNIQUE    USERS

Oracle同样自动创建了一个同名的唯一索引,而且也不允许再在此列上创建唯一索引或非唯一索引。

我们知道,主键约束要求列值非空(NOT NULL),那么唯一键约束是否也要求非空呢?

SQL> insert into test values(1, 'Sally');

1 row created.

SQL> insert into test values(null, 'Tony');

1 row created.

SQL> insert into test values(null, 'Jack');

1 row created.

SQL> select * from test;

ID NAME

---------- --------------------

1 Sally

Tony

Jack

从实验结果来看,唯一键约束并没有非空要求。

接下来我们看看唯一索引对列值的非空要求有什么不同。

SQL> drop table test purge;

Table dropped.

SQL> create table test(

2  id int,

3  name varchar2(20));

Table created.

SQL> create unique index idx_test_id on test (id);

Index created.

SQL> insert into test values(1, 'Sally');

1 row created.

SQL> insert into test values(null, 'Tony');

1 row created.

SQL> insert into test values(null, 'Jack');

1 row created.

SQL> select * from test;

ID NAME

---------- --------------------

1 Sally

Tony

Jack

通过实验,我们看出唯一索引与唯一键约束一样对列值非空不做要求。

如果我们让主键约束或者唯一键约束失效,Oracle自动创建的唯一索引是否会受到影响?

SQL> drop table test purge;

Table dropped.

SQL> create table test(

2  id int,

3  name varchar2(20),

4  constraint uk_test unique(id));

Table created.

SQL> select index_name, index_type, uniqueness from user_indexes;

INDEX_NAME                     INDEX_TYPE                  UNIQUENES

------------------------------ --------------------------- ---------

UK_TEST                        NORMAL                      UNIQUE

SQL> alter table test disable constraint uk_test;

Table altered.

SQL> select index_name, index_type, uniqueness from user_indexes;

no rows selected

当主键约束或者唯一键约束失效时,Oracle会删除隐式创建的唯一索引。

如果我们先创建唯一索引,再创建主键或者唯一键约束,情况又会怎样呢?

SQL> drop table test purge;

Table dropped.

SQL> create table test(

2  id int,

3  name varchar2(20));

Table created.

SQL> create unique index idx_test_id on test (id);

Index created.

SQL> select index_name, index_type, uniqueness

2  from user_indexes

3  where table_owner = 'SCOTT'

4  and table_name = 'TEST';

-- 何问起 hovertree.com

INDEX_NAME                     INDEX_TYPE                  UNIQUENES

------------------------------ --------------------------- ---------

IDX_TEST_ID                    NORMAL                      UNIQUE

SQL> alter table test add constraint uk_test unique (id);

Table altered.

SQL> select index_name, index_type, uniqueness

2  from user_indexes

3  where table_owner = 'SCOTT'

4  and table_name = 'TEST';

INDEX_NAME                     INDEX_TYPE                  UNIQUENES

------------------------------ --------------------------- ---------

IDX_TEST_ID                    NORMAL                      UNIQUE

SQL> select constraint_name, constraint_type

2  from user_constraints

3  where table_name = 'TEST';

CONSTRAINT_NAME                C

------------------------------ -

UK_TEST                        U

SQL> alter table test disable constraint uk_test;

Table altered.

SQL> select constraint_name, constraint_type, status

2  from user_constraints

3  where table_name = 'TEST';

CONSTRAINT_NAME                C STATUS

------------------------------ - --------

UK_TEST                        U DISABLED

SQL> select index_name, index_type, uniqueness, status

2  from user_indexes

3  where table_owner = 'SCOTT'

4  and table_name = 'TEST';

INDEX_NAME                     INDEX_TYPE                  UNIQUENES STATUS

------------------------------ --------------------------- --------- --------

IDX_TEST_ID                    NORMAL                      UNIQUE    VALID

实验结果表明,先创建的唯一索引不受约束失效的影响。

总结如下:

(1)主键约束和唯一键约束均会隐式创建同名的唯一索引,当主键约束或者唯一键约束失效时,隐式创建的唯一索引会被删除;

(2)主键约束要求列值非空,而唯一键约束和唯一索引不要求列值非空;

(3)相同字段序列不允许重复创建索引

http://www.cnblogs.com/roucheng/

转载于:https://www.cnblogs.com/roucheng/p/weiyi.html

主键、唯一键与唯一索引的区别相关推荐

  1. oracle主键 唯一索引的区别,Oracle 主键、唯一键与唯一索引的区别

    一般,我们看到术语"索引"和"键"交换使用,但实际上这两个是不同的.索引是存储在数据库中的一个物理结构,键纯粹是一个逻辑概念.键代表创建来实施业务规则的完整性约 ...

  2. oracle主键和唯一索引,Oracle 主键、唯一键与唯一索引的区别

    如果我们让主键约束或者唯一键约束失效,Oracle自动创建的唯一索引是否会受到影响? SQL> drop table test purge; Table dropped. SQL> cre ...

  3. mysql 导入主键冲突_MySQL 处理插入过程中的主键唯一键重复值的解决方法

    本篇文章主要介绍在插入数据到表中遇到键重复避免插入重复值的处理方法,主要涉及到IGNORE,ON DUPLICATE KEY UPDATE,REPLACE:接下来就分别看看这三种方式的处理办法. IG ...

  4. 主键primary key和唯一索引unique index

    1)主键一定是唯一性索引,唯一性索引并不一定就是主键. 2)主键就是能够唯一标识表中某一行的属性或属性组,一个表只能有一个主键,但可以有多个候选索引. 3)主键常常与外键构成参照完整性约束,防止出现数 ...

  5. MySQL主键唯一键重复插入解决方法

    我们插入数据的时候,有可能碰到重复数据插入的问题,但是这些数据又是不被允许有重复值: CREATE TABLE stuInfo ( id INT NOT NULL COMMENT '序号', name ...

  6. MySQL 处理插入重主键唯一键重复值办法

    本篇文章主要介绍在插入数据到表中遇到键重复避免插入重复值的处理方法,主要涉及到IGNORE,ON DUPLICATE KEY UPDATE,REPLACE:接下来就分别看看这三种方式的处理办法. IG ...

  7. MySQL主键、普通索引和唯一索引的区别、全文索引

    1 概念区分 普通索引 V.S 唯一索引 普通索引可重复,唯一索引和主键一样不能重复. 唯一索引可作为数据的一个合法验证手段,例如学生表的身份证号码字段,人为规定该字段不得重复,那么就使用唯一索引.( ...

  8. 数据库键(key)、主键(primaryKey)、索引(index)、唯一索引(uniqueIndex)区别

    1.键:key,数据库的物理结构,一是约束(偏重于约束和规范数据库的结构完整性),二是索引(辅助查询用的).包括:primary key, unique key, foreign key(主键/唯一键 ...

  9. oracle中主键和唯一索引的区别说明

    上周六去参加上海Oracle WDP俱乐部沙龙的一次交流,其中提到了关于"Oracle中主键和唯一索引的区别",基本上大家都可以说上几个,在网上也可以找到,但是总感觉不太全,根据自 ...

最新文章

  1. 运算加减乘除的c语言程序,求一个计算加减乘除的C语言程序
  2. 如何删除非当前用户下的JOB
  3. 十三、Vuex学习笔记
  4. IntelliJ IDEA 14 创建maven项目二
  5. delta对冲策略_股票基础知识—Delta中性理论
  6. 小米机器人 尘盒配件_石头扫地机器人T6评测:一款提升生活辛福感的宝物
  7. C# File流操作
  8. 本地建mysql数据库_mysql 安装及新建本地数据库遇到的问题
  9. 高等代数——大学高等代数课程创新教材(丘维声)——第0章 笔记+习题
  10. aistudio下载文件避免报错
  11. Excel如何批量删除空行,Leo老师来教你!
  12. 神秘诡异的量子世界是如何毁掉科学家三观的?
  13. Mac 显示/不显示隐藏文件
  14. python代码手机壁纸_python 爬取王者荣耀高清壁纸
  15. 防火墙 蓝精灵DoS P127
  16. springboot 利用aop实现系统日志和操作日志记录
  17. sysvol 域控制器 文件_重建域控SYSVOL和NETLOGON共享
  18. li前面的小圆点样式修改
  19. CTF-WEB总结(四-题目来源i春秋)
  20. Spring事务管理案例

热门文章

  1. rmi 反序列化漏洞_提醒:Apache Dubbo存在反序列化漏洞
  2. python3命令行运行程序怎么关闭_python中怎样退出程序运行?
  3. c 获取char*的长度_最大的 String 字符长度是多少?
  4. python – 处理psycopg2中的错误 psycopg2.errors.InFailedSqlTransaction: current transaction is aborted, comm
  5. win7 X64 编译ffmpeg
  6. mongodb学习篇
  7. 5、Linux系统的目录结构
  8. 【多线程】C++11进行多线程开发 (std::thread)
  9. Programming Computer Vision with Python (学习笔记二)
  10. freemarker 教程