热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

Oracle主键约束、唯一键约束、唯一索引的区别【主键约束和唯一键

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

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

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

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

SQL> select * fromv$version;

BANNER

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

Oracle Database 11g EnterpriseEdition 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 tabletest (

2 id int,

3 namevarchar2(20),

4 constraintpk_testprimarykey(id))

5 tablespaceusers;

Table created.

SQL> selectconstraint_name, constraint_type from user_constraints;

CONSTRAINT_NAME C

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

PK_TEST P

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

SQL> selectindex_name, index_type, uniqueness, tablespace_name

2 fromuser_indexes

3 wheretable_owner='SCOTT'

4 and table_name ='TEST';

INDEX_NAME INDEX_TYPE UNIQUENES TABLESPACE_NAME

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

PK_TEST NORMAL UNIQUE USERS

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

SQL> create uniqueindex idx_test_uk on test(id);

create unique index idx_test_uk ontest(id)

*

ERROR at line 1:

ORA-01408: such column list alreadyindexed

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

SQL> create indexidx_test_id on test(id);

create index idx_test_id ontest(id)

*

ERROR at line 1:

ORA-01408: such column list alreadyindexed

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

SQL> drop table testpurge;

Table dropped.

SQL> create tabletest(

2 id int,

3 namevarchar2(20),

4 constraintuk_testunique(id));

Table created.

SQL> selectconstraint_name, constraint_type from user_constraints;

CONSTRAINT_NAME C

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

UK_TEST U

查看此时的索引情况:

SQL> selectindex_name, index_type, uniqueness, tablespace_name

2 fromuser_indexes

3 wheretable_owner='SCOTT'

4 and table_name ='TEST';

INDEX_NAME INDEX_TYPE UNIQUENES TABLESPACE_NAME

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

UK_TEST NORMAL UNIQUE USERS

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

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

SQL> insert intotest values(1, 'Sally');

1 row created.

SQL> insert intotest values(null, 'Tony');

1 row created.

SQL> insert intotest values(null, 'Jack');

1 row created.

SQL> select * fromtest;

ID NAME

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

1 Sally

Tony

Jack

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

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

SQL> drop table testpurge;

Table dropped.

SQL> create tabletest(

2 id int,

3 namevarchar2(20));

Table created.

SQL> create uniqueindex idx_test_id on test (id);

Index created.

SQL> insert intotest values(1, 'Sally');

1 row created.

SQL> insert intotest values(null, 'Tony');

1 row created.

SQL> insert intotest values(null, 'Jack');

1 row created.

SQL> select * fromtest;

ID NAME

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

1 Sally

Tony

Jack

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

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

SQL> drop table testpurge;

Table dropped.

SQL> create tabletest(

2 id int,

3 namevarchar2(20),

4 constraint uk_testunique(id));

Table created.

SQL> selectindex_name, index_type, uniqueness from user_indexes;

INDEX_NAME INDEX_TYPE UNIQUENES

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

UK_TEST NORMAL UNIQUE

SQL> alter tabletest disable constraint uk_test;

Table altered.

SQL> selectindex_name, index_type, uniqueness from user_indexes;

no rows selected

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

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

SQL> drop table testpurge;

Table dropped.

SQL> create tabletest(

2 id int,

3 namevarchar2(20));

Table created.

SQL> create uniqueindex idx_test_id on test (id);

Index created.

SQL> selectindex_name, index_type, uniqueness

2 fromuser_indexes

3 where table_owner ='SCOTT'

4 and table_name ='TEST';

INDEX_NAME INDEX_TYPE UNIQUENES

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

IDX_TEST_ID NORMAL UNIQUE

SQL> alter tabletest add constraint uk_test unique (id);

Table altered.

SQL> selectindex_name, index_type, uniqueness

2 fromuser_indexes

3 where table_owner ='SCOTT'

4 and table_name ='TEST';

INDEX_NAME INDEX_TYPE UNIQUENES

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

IDX_TEST_ID NORMAL UNIQUE

SQL> selectconstraint_name, constraint_type

2 fromuser_constraints

3 where table_name ='TEST';

CONSTRAINT_NAME C

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

UK_TEST U

SQL> alter tabletest disable constraint uk_test;

Table altered.

SQL> selectconstraint_name, constraint_type, status

2 fromuser_constraints

3 where table_name ='TEST';

CONSTRAINT_NAME C STATUS

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

UK_TEST U DISABLED

SQL> selectindex_name, index_type, uniqueness, status

2 fromuser_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)相同字段序列不允许重复创建索引;

推荐阅读
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • PHP 编程疑难解析与知识点汇总
    本文详细解答了 PHP 编程中的常见问题,并提供了丰富的代码示例和解决方案,帮助开发者更好地理解和应用 PHP 知识。 ... [详细]
  • PyCharm下载与安装指南
    本文详细介绍如何从官方渠道下载并安装PyCharm集成开发环境(IDE),涵盖Windows、macOS和Linux系统,同时提供详细的安装步骤及配置建议。 ... [详细]
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • 本周信息安全小组主要进行了CTF竞赛相关技能的学习,包括HTML和CSS的基础知识、逆向工程的初步探索以及整数溢出漏洞的学习。此外,还掌握了Linux命令行操作及互联网工作原理的基本概念。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 本文详细介绍了如何在BackTrack 5中配置和启动SSH服务,确保其正常运行,并通过Windows系统成功连接。涵盖了必要的密钥生成步骤及常见问题解决方法。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 掌握Linux:基础命令入门
    本章节深入浅出地介绍了Linux系统中的基本命令操作,帮助读者快速上手并理解其核心功能。 ... [详细]
  • 解决Linux系统中pygraphviz安装问题
    本文探讨了在Linux环境下安装pygraphviz时遇到的常见问题,并提供了详细的解决方案和最佳实践。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
author-avatar
mobiledu2502926273
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有