Oracle主键约束、唯一键约束、唯一索引的区别【主键约束和唯一键约束均会隐式创建同名的唯一索引】
来源:互联网 发布:linux kvm安装 编辑:程序博客网 时间:2024/04/28 12:25
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
TNS for Linux: Version 11.2.0.1.0 -Production
NLSRTL Version 11.2.0.1.0 -Production
SQL> create tabletest (
Table created.
SQL> selectconstraint_name, constraint_type from user_constraints;
CONSTRAINT_NAME
-------------------------------
PK_TEST
在test表中,我们指定了ID列作为主键,Oracle数据库会自动创建一个同名的唯一索引:
SQL> selectindex_name, index_type, uniqueness, tablespace_name
INDEX_NAME
---------------------------------------- ---------------------------------------
PK_TEST
此时,如果我们再试图在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(
Table created.
SQL> selectconstraint_name, constraint_type from user_constraints;
CONSTRAINT_NAME
-------------------------------
UK_TEST
查看此时的索引情况:
SQL> selectindex_name, index_type, uniqueness, tablespace_name
INDEX_NAME
---------------------------------------- ---------------------------------------
UK_TEST
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;
------------------------------
从实验结果来看,唯一键约束并没有非空要求。
接下来我们看看唯一索引对列值的非空要求有什么不同。
SQL> drop table testpurge;
Table dropped.
SQL> create tabletest(
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;
------------------------------
通过实验,我们看出唯一索引与唯一键约束一样对列值非空不做要求。
如果我们让主键约束或者唯一键约束失效,Oracle自动创建的唯一索引是否会受到影响?
SQL> drop table testpurge;
Table dropped.
SQL> create tabletest(
Table created.
SQL> selectindex_name, index_type, uniqueness from user_indexes;
INDEX_NAME
--------------------------------------------------------- ---------
UK_TEST
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(
Table created.
SQL> create uniqueindex idx_test_id on test (id);
Index created.
SQL> selectindex_name, index_type, uniqueness
INDEX_NAME
--------------------------------------------------------- ---------
IDX_TEST_ID
SQL> alter tabletest add constraint uk_test unique (id);
Table altered.
SQL> selectindex_name, index_type, uniqueness
INDEX_NAME
--------------------------------------------------------- ---------
IDX_TEST_ID
SQL> selectconstraint_name, constraint_type
CONSTRAINT_NAME
-------------------------------
UK_TEST
SQL> alter tabletest disable constraint uk_test;
Table altered.
SQL> selectconstraint_name, constraint_type, status
CONSTRAINT_NAME
------------------------------ ---------
UK_TEST
SQL> selectindex_name, index_type, uniqueness, status
INDEX_NAME
--------------------------------------------------------- --------- --------
IDX_TEST_ID
实验结果表明,先创建的唯一索引不受约束失效的影响。
总结如下:
(1)主键约束和唯一键约束均会隐式创建同名的唯一索引,当主键约束或者唯一键约束失效时,隐式创建的唯一索引会被删除;
(2)主键约束要求列值非空,而唯一键约束和唯一索引不要求列值非空;
(3)相同字段序列不允许重复创建索引;
- Oracle主键约束、唯一键约束、唯一索引的区别【主键约束和唯一键约束均会隐式创建同名的唯一索引】
- Oracle主键约束、唯一键约束、唯一索引的区别
- 唯一性约束、主键约束、唯一索引的区别
- oracle 主键 唯一约束 索引
- 唯一约束和主键约束的区别
- 主键约束和唯一约束的区别
- ORACLE中主键约束跟唯一索引的区别
- ORACLE中主键约束跟唯一索引的区别
- 如何删除通过主键和唯一约束创建的索引
- 唯一索引、主键、Unique约束
- 主键 和 唯一键(唯一约束)
- Oracle中唯一约束和唯一索引的区别
- 唯一性约束和主键的区别- -
- Oracle:查找表的主键,外键,唯一性约束,索引
- Oracle:查找表的主键,外键,唯一性约束,索引
- Oracle:查找表的主键,外键,唯一性约束,索引
- Oracle:查找表的主键,外键,唯一性约束,索引
- Oracle:查找表的主键,外键,唯一性约束,索引
- 2.1: 判断一个正整数是否为质数的算法.
- Android之Service用法(一)
- 有关临终往生
- hadoop2.x配置 - override log4j.properties in hadoop
- 黑马程序员_并发编程笔记_初学简单概念
- Oracle主键约束、唯一键约束、唯一索引的区别【主键约束和唯一键约束均会隐式创建同名的唯一索引】
- 博客声明
- socket与TCP/UDP编程
- 关于超市/便利/专业店的SCM供应链管理方案浅析
- Highcharts属性中英文参照
- Android 调用谷歌语音识别
- 《C++面向对象》在C++中子类继承和调用父类的构造函数方法
- 敢不敢测试下你的出离心
- linux代码风格