数据库索引键uk_oracle键、索引、约束及其区别

本文详细介绍了数据库中的索引、键(包括普通索引、唯一索引、主键索引和外键)以及约束的概念,探讨了它们的优缺点和应用场景。举例说明了不同类型的索引在数据检索中的作用,强调了主键和唯一键在数据完整性方面的重要性,同时也提到了主键约束与唯一键约束的区别。文章通过实际的SQL操作展示了创建、删除和使用索引的过程,以及约束的启用和禁用对索引的影响。
摘要由CSDN通过智能技术生成

键、索引、约束及其区别

今天下午刚好没事,把一些基础性的概念理顺一下,存档,省的麻烦,嘿嘿

一.索引

1.       什么是索引?

索引是对数据库表中一列或多列的值进行排序的一种结构。

在关系型数据库中,索引是一种与表有关的数据库结构,是事实存在的。它可以使对于表的select等等操作更加快速,相当于一本书的目录。

对于一张表,如果我们想要找到某一列符合特定值的记录,第一种方法是全表搜索,匹配,然后把所有符合的记录列出,但是这样做会消耗大量数据库系统时间,并造成大量磁盘I/O操作;第二种就是在表中建立索引,然后在索引中找到符合查询条件的索引值,最后通过保存在索引中的ROWID(相当于页码)快速找到表中对应的记录。

索引是一个单独的、物理的数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。由此可知,索引是要消耗数据库空间的。

并非所有的数据库都以相同的方式使用索引。作为通用规则,只有当经常查询索引列中的数据时,才需要在表上创建索引。索引占用磁盘空间,并且降低添加、删除和更新行的速度。在多数情况下,索引用于数据检索的速度优势大大超过它的不足之处。但是,如果应用程序非常频繁地更新数据或磁盘空间有限,则可能需要限制索引的数量。

可以使用单列作为索引,也可以使用多列联合作为索引。

2.    索引的优缺点

优点:

(1)大大加快数据的检索速度;

(2)创建唯一性索引,保证数据库表中每一行数据的唯一性;

(3)加速表和表之间的连接;

(4)在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。

缺点:

(1)索引需要占物理空间。

(2)当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。

建立索引时的注意事项:

(1)   考虑已在表上创建的索引数量。最好避免在单个表上有很多索引

(2)   检查已在表上创建的索引的定义。最好避免包含共享列的重叠索引

(3)   检查某列中唯一数据值的数量,并将该数量与表中的行数进行比较。比如如果有1000w记录,某字段为性别,只有男,女。也就是说一半的记录都是重复的,这样就要考虑是否还有必要建立索引了。

3.       一些索引类别

(1)       普通索引

也即不加任何限制的索引。可通过以下语句理解。

create table zjj_temp_1 (id number(10),first_name char(10),last_name char(10),age number(3),val number(10,2));

insert into zjj_temp_1 values(1,'junjie','zhang',25,4000);

select * from zjj_temp_1;

此时一条记录已经插入进入了。

create index zjj_temp_index_1 on zjj_temp_1(first_name);

--------建立索引

insert into zjj_temp_1 values(1,'junjie','zhang',25,4000)

--------再次插入一条一模一样的记录

select * from zjj_temp_1;

Ok!两条记录出现了,也即此索引的作用是让你再查找first_name为某一个特定值的记录时速度更快而已,仅此而已。

(2)       唯一索引

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

继续分析例子:

drop index zjj_temp_index_1; ----删除上文创建的普通索引。

create unique index zjj_temp_1 on zjj_temp_1(id);

----建立唯一索引

数据库报错了?

是的,说找到重复的关键字。

从上文我们可以看到,zjj_temp_1表中有两条记录,id都是1.

这样是唯一索引是不允许的,所以自然就创建不起来了。

delete from zjj_temp_1 where rownum<2;  --删除一行

create unique index zjj_temp_1 on zjj_temp_1(id);

----继续创建,发现这次成功了。

insert into zjj_temp_1 values(2,'junjie','zhang',25,4000);

----成功

insert into zjj_temp_1 values(1,'kesi','ma',25,4000); 失败!!!

耶!就是这样!

(3)       主键索引

数据库表

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值