Oracle索引&约束

1索引的原理

索引是一种允许直接访问数据表某一数据行的树形结构,为了提高查询效率而引入,是独立于表的对象,可以存放在与表不同的表空间(TABLESPACE)中

索引记录中存有索引关键字指向表中数据的指针(地址)

对索引进行的I/O操作比对表进行操作要少很多

索引一旦被建立就将被Oracle系统自动维护,查询语句中不用指定使用哪个索引

索引是一种提高查询效率的机制

Oracle B-tree索引的结构

ROWID:伪劣,唯一标识一条数据记录,可理解为行地址


1.1创建索引

单列索引:

CREATE [UNIQUE] INDEX index_name
ON table(column[,column]); -- index_name 表示索引名称
-- table 表示表名
-- column 表示列名,可以建立单列索引或复合索引
-- UNIQUE 表示唯一索引 -- 在EMP表的ENAME列上建立索引
CREATE INDEX idx_emp_ename ON emp(ename);

复合索引:

复合索引也叫多列索引,是基于多个列的索引

如果经常在ORDER BY 子句中使用job和sal作为排序依据,可以建立复合索引:

CREATE INDEX idx_emp_job_sal ON emp(job,sal);
-- 当做下面的查询时,会自动应用索引idx_emp_job_sal
SELECT empno,ename,sal,job FROM emp ORDER BY job,sal;

基于函数的索引:

如果需要在emp表的ename列上执行大小写无关搜索,可以在此列上建立一个基于UPPER函数的索引:

CREATE INDEX emp_ename_upper_idx ON emp(UPPER(ename));

当做下面的查询时,会自动应用刚刚建立的索引:

SELECT * FROM emp WHERE UPPER(ename) = 'KING';

修改和删除索引:

如果经常在索引列上执行DML操作,需要定期重建索引,提高索引的空间利用率

ALTER INDEX index_name REBUILD;
-- 重建索引idx_emp_ename
ALTER INDEX idx_emp_ename REBUILD;

当一个表上有不合理的索引,会导致操作性能下降,删除索引的语法:

DROP INDEX index_name;
-- 删除索引idx_emp_ename
DROP INDEX idx_emp_ename;

合理使用索引提升查询效率:

  • 为经常出现在WHERE子句中的列创建索引

  • 为经常出现在ORDER BY、DISTINCT后面的字段建立索引。如果建立的是复合索引,索引的字段顺序要和这些关键字后面的字段顺序一致。

  • 为经常作为表的连接条件的列上创建索引

  • 不要在经常做DML操作的表上建立索引

  • 不要在小表上建立索引

  • 限制表上的索引数目,索引并不是越多越好

  • 删除很少被使用的、不合理的索引


2约束

约束的作用

  • 约束(CONSTRAINT)的全称是约束条件,也称作完整性约束条件

  • 约束是在数据表上强制执行的一些数据校验规则,当执行DML操作时,数据必须符合这些规则,如果不符合则无法执行

  • 约束条件可以保证表中数据的完整性,保证数据间的商业逻辑


约束条件:

  • 非空约束(NOT NULL),简称NN

  • 唯一性约束(UNIQUE),简称UK

  • 主键约束(PRIMARY Key),简称PK

  • 外键约束(Foreign Key),简称FK

  • 检查约束(Check),简称CK


2.1非空约束

2.1.1建表时添加非空约束

  • 非空约束用于确保字段值不为空

  • 默认情况下,任何列都允许有空值,但业务逻辑可能会要求某些列不能取空值

  • 当某个字段被设置了非空约束条件,这个字段中必须存在有效值,即:

    • 当执行INSERT操作时,必须提供这个列的数据

    • 当执行UPDATE操作时,不能给这个列的值设置为NULL

CREATE TABLE employees(
eid NUMBER(6),
name VARCHAR(30) NOT NULL,
salary NUMBER(7,2),
hiredate DATE
CONSTRAINT employees_hiredate_nn NOT NULL
);

2.1.2修改表时添加非空约束

可以在建表之后,通过修改表的定义,添加非空约束

ALTER TABLE employees MODIFY (eid NUMBER(6) NOT NULL);

2.1.3取消非空约束

如果业务要求取消某列的非空约束,可以采用重建表或者修改表的方式:

ALTER TABLE employees MODIFY (eid NUMBER(6) null);

2.2唯性一约束

  • 唯一性(Unique)约束条件用于保证字段或者字段的组合不出现重复值

  • 当给表的某个列定义了唯一性约束条件,该列的值不允许重复,但允许是NULL值

  • 唯一性约束条件可以在建表同时建立,也可以在建表以后再建立

2.2.1添加唯一性约束

在建表employees的同时,在eid、email列上创建唯一性约束条件,并在建表后在name列上建立一个名为employees_name_uk的唯一性约束条件

DROP TABLE employees;-- 将原有的表删除重建
CREATE TABLE employees(
eid NUMBER(6) UNIQUE,
name VARCHAR(30) NOT NULL,
salary NUMBER(7,2),
email VARCHAR2(50),
hiredate DATE,
CONSTRAINT employees_email_uk UNIQUE(email)
);

2.2.2建表后添加唯一约束

ALTER TABLE employees
ADD CONSTRAINT employees_name_uk UNIQUE(name);

2.3主键

主键(Primary Key)约束条件从功能上看相当于非空(NOT NULL)且唯一(UNIQUE)的组合

主键字段可以是单字段或多字段组合,即:在主键约束下的单字段或者多字段组合上不允许有空值,也不允许有重复值

主键可以用来在表中唯一的确定一行数据

一个表上只允许建立一个主键,而其他约束条件则没有明确的个数限制

2.3.1主键选取的原则

  • 主键应是对系统无意义的数据

  • 永远也不要更新主键,让主键除了唯一标识一行之外,再无其他用途

  • 主键不应包含动态变化的数据,如时间戳

  • 主键应自动生成,不要认为干预,以免使它带有除了唯一标识一行以外的意义

  • 主键尽量建立在单列上

2.3.2添加主键约束

  • 建表时添加主键约束
CREATE TABLE emp2(
eid NUMBER(6) PRIMARY KEY,
name VARCHAR(30) NOT NULL,
salary NUMBER(7,2),
email VARCHAR2(50),
hiredate DATE
);
  • 建表后创建主键约束
CREATE TABLE emp2(
eid NUMBER(6),
name VARCHAR(30) NOT NULL,
salary NUMBER(7,2),
email VARCHAR2(50),
hiredate DATE
);
ALTER TABLE emp2 ADD CONSTRAINT emp2_eid_pk PRIMARY KEY (eid);

2.4外键

外键约束条件定义在两个表的字段或一个表的两个字段上,用于保证相关两个字短的关系

2.4.1添加外键约束

CREATE TABLE emp3(
eid NUMBER(6),
name VARCHAR(30) NOT NULL,
salary NUMBER(7,2),
email VARCHAR2(50),
deptno NUMBER(4),
hiredate DATE
); ALTER TABLE emp3
ADD CONSTRAINT emp3_deptno_fk
FOREIGN KEY (deptno) REFERENCES dept(deptno);

外键约束对一致性的维护:

  • 外键约束条件包括两个方面的数据约束

    • 从表上定义的外键的列值,必须从主表被参照的列值中选取,或者为NULL

    • 当主表参照列的值被从表参照时,主表的该行记录不允许被删除

2.5检查

检查(Check)约束条件用来强制在字段上的每个值都要满足Check中定义的条件

当定义了Check约束的列新增或修改数据时,数据必须符合Check约束中定义的条件

2.5.1添加检查约束

  • 员工薪水必须大于2000元
ALTER TABLE emp3
ADD CONSTRAINT emp3_salary_check
CHECK(salary > 2000); -- 正常插入数据
INSERT INTO emp3(eid,name,salary,deptno)
VALUES(123,'pp',2500,40);
-- 试图修改薪水为1500,更新失败 UPDATE emp3 SET salary = 1500 WHERE eid = 123;

Oracle索引&约束的更多相关文章

  1. 十七, Oracle索引约束

    管理索引-原理介绍 索引是用于加速数据存取的数据对象.合理的使用索引可以大大降低i/o次数,从而提高数据访问性能. 单列索引 适当的索引对于大型数据库的性能有不错的提升, 但在创建索引时要小心.选择字 ...

  2. oracle的约束隐式创建索引和先索引后约束的区别

    oracle的约束隐式创建索引和先索引后约束的区别 两种情况:1.对于创建约束时隐式创建的索引,在做删除操作的时候: 9i~11g都会连带删除该索引 2.对于先创建索引,再创建约束(使用到此索引)这种 ...

  3. Oracle索引梳理系列(八)- 索引扫描类型及分析(高效索引必备知识)

    版权声明:本文发布于http://www.cnblogs.com/yumiko/,版权由Yumiko_sunny所有,欢迎转载.转载时,请在文章明显位置注明原文链接.若在未经作者同意的情况下,将本文内 ...

  4. ORACLE 索引概述

    索引是数据库中一种可选的数据结构,她通常与表或簇相关.用户可以在表的一列或数列上建立索引,以提高在此表上执行 SQL 语句的性能.就像本文档的索引可以帮助读者快速定位所需信息一样,Oracle 的索引 ...

  5. Oracle 索引扫描的4种类型

    根据索引的类型与where限制条件的不同,有4种类型的Oracle索引扫描: 3,4可归一种 (1) 索引唯一扫描(index uniquescan) (2) 索引范围扫描(index range s ...

  6. 转://创建oracle索引时需要注意的7个事项

    在创建Oracle索引时,有一些问题使我们需要注意的,下面就为您介绍创建oracle索引的一些注意事项,希望对您学习创建Oracle索引方面能有所帮助. 1.一般来说,不需要为比较小的表创建索引: 2 ...

  7. Oracle索引技术研究

    Oracle索引类型 B树索引 特定类型索引 确定索引列 主键和唯一键值列的索引 外键索引 其他合适的索引列 B树索引 B树索引算法 B树是指B-tree(Balanced Tree),B树的存在是为 ...

  8. Oracle 索引扫描的五种类型

    之前在讨论CBO和RBO的时候提到了索引扫描的几种类型. Oracle Optimizer CBO RBO http://blog.csdn.net/tianlesoftware/archive/20 ...

  9. oracle索引的理解

    1.当查询表时where条件中有多个索引时,优先使用主键索引,其它索引会失效. 2.当查询的返回的数据占总量数据的百分比小于20%时,建索引才有效果 3.不是主键的索引值可以为空,主键索引不能为空. ...

  10. oracle索引监控

    目的:监控oracle索引的有效性,看索引有没有被使用.然后根据监控结果删除或者调整索引. 步骤: 1.监控指定索引 命令: alter index  索引名 monitoring usage;  如 ...

随机推荐

  1. 首次引入大模型!Bert-vits2-Extra中文特化版40秒素材复刻巫师3叶奈法

    Bert-vits2项目又更新了,更新了一个新的分支:中文特化,所谓中文特化,即针对中文音色的特殊优化版本,纯中文底模效果百尺竿头更进一步,同时首次引入了大模型,使用国产IDEA-CCNL/Erlan ...

  2. CMU DLSys 课程笔记 2 - ML Refresher / Softmax Regression

    CMU DLSys 课程笔记 2 - ML Refresher / Softmax Regression 本节 Slides | 本节课程视频 这一节课是对机器学习内容的一个复习,以 Softmax ...

  3. 0X01 位运算笔记

    位运算,经常可以用来处理一些数学或动归方面的问题,通常会在数据范围较小的情况下使用. 为方便起见,一个 \(\mathrm{n}\) 位二进制数从右到左分别为第 \(\mathrm{0 \sim n ...

  4. 【玩转鲲鹏DevKit系列】如何快速迁移软件包?

    本文分享自华为云社区<[玩转鲲鹏DevKit系列]如何快速迁移软件包?>,作者: 华为云社区精选 . 软件包含各种不同格式的文件,如RPM包通常包含二进制文件.SO 库文件.JAR包.配置 ...

  5. 物联网为什么需要5G?

    摘要:5G,这个词,我想每个接触ICT行业的朋友都有听过,可5G的到来,对物联网行业的帮助究竟是什么? 我相信,95%的ICT从业者对5G这一概念没有一个清晰的认知. 这一期文章的主题主要是普及一些5 ...

  6. 云小课|基于华为云WAF的日志运维分析,构筑设备安全的城墙

    阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说).深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云.更多精彩内容请单击此处. 摘要:云日志服务用于收集 ...

  7. openGemini内核源码正式对外开源

    摘要:openGemini是一个开源的分布式时序数据库系统,可广泛应用于物联网.车联网.运维监控.工业互联网等业务场景,具备卓越的读写性能和高效的数据分析能力. 本文分享自华为云社区<华为云面向 ...

  8. 《低代码发展白皮书(2022年)》&《2022低代码·无代码应用案例汇编》,发布了

    摘要:信息通信研究院云计算与大数据研究所副所长栗蔚发布了<低代码发展白皮书(2022年)>&<2022低代码·无代码应用案例汇编>. 本文分享自华为云社区<华为参 ...

  9. SQL操作:WITH表达式及其应用

    摘要:本文将围绕WITH,以及更高阶的WITH RECURSIVE表达式介绍其语法特征和具体使用规范,以及在GaussDB(DWS)中如何进行WITH表达式的调优 本文分享自华为云社区<Gaus ...

  10. 解放重复劳动丨华为云IoT API Explorer对接小程序实现系统化应用

    摘要:<物联网平台接口调用实验>详细讲解了API Explorer的应用,根据提供的接口,结合真实案例,制作了一个小程序,真正的把它应用起来,解放重复劳动,小程序是一个很好的平台,作为应用 ...