最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

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

来源:懂视网 责编:小采 时间:2020-11-09 07:25:12
文档

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

Oracle主键约束、唯一键约束、唯一索引的区别【主键约束和唯一键:一般,我们看到术语索引和键交换使用,但实际上这两个是不同的。 索引是存储在数据库中的一个物理结构,键纯粹是一个逻辑概念。键代表创建来实施业务规则的完整性约束。索引和键的混淆通常是由于数据库使用索引来实施完整性约束。 接下来我们看看数
推荐度:
导读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)相同字段序列不允许重复创建索引;

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文档

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

Oracle主键约束、唯一键约束、唯一索引的区别【主键约束和唯一键:一般,我们看到术语索引和键交换使用,但实际上这两个是不同的。 索引是存储在数据库中的一个物理结构,键纯粹是一个逻辑概念。键代表创建来实施业务规则的完整性约束。索引和键的混淆通常是由于数据库使用索引来实施完整性约束。 接下来我们看看数
推荐度:
标签: 区别 一键 主键
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top