数据库 索引,序列 的理解与使用方法

索引是建立在数据库表中的某些列的上面,是与表关联的,可提供快速访问数据方式,但会影响增删改的效率;常用类型(按逻辑分类):单列索引和组合索引、唯一索引和非唯一索引。

 

什么时候要创建索引

(1)在经常需要搜索、主键、连接的列上

(2)表很大,记录内容分布范围很广

(3)在经常需要根据范围进行搜索的列上创建索引,因为索引已经排序,其指定的范围是连续的

(4)在经常使用在WHERE子句中的列上面创建索引

 

什么时候不要创建索引

(1)表经常进行 INSERT/UPDATE/DELETE 操作

(2)表很小(记录超少)

(3)列名不经常作为连接条件或出现在 WHERE 子句中

(4)对于那些定义为text, image和bit数据类型的列不应该增加索引

创建索引

 

【语法】

CREATE [UNIQUE] INDEX <index_name> ON <table_name>(字段 [ASC|DESC]);

 

【说明】

UNIQUE --确保所有的索引列中的值都是可以区分的。

[ASC|DESC] --在列上按指定排序创建索引。

 

(创建索引的准则:

1.如果表里有几百行记录则可以对其创建索引(表里的记录行数越多索引的效果就越明显)。

2.不要试图对表创建两个或三个以上的索引。

3.为频繁使用的行创建索引。)

 

 

【示例】

--创建单列唯一索引,表中的列值将不允许重复

create unique index index_emp_empno on emp(empno);

 

--创建单列非唯一索引

create index index_emp_ename on emp(ename);

 

--创建组合列、唯一索引

create unique index index_emp_ename_job on emp(ename,job);

 

--创建组合列、非唯一索引

create index index_emp_job_sal on emp(job,sal);

 

 

​​​​​​​删除索引

 

【语法】

DROP INDEX <index_name>;

 

 

【示例】

--删除索引

drop index index_emp_empno;

drop index index_emp_ename;

drop index index_emp_ename_job;

drop index index_emp_job_sal;

 

 

序列

序列是oracle提供的一个产生唯一数值型值的机制。通常用于表的主健值,序列只能保证唯一,不能保证连续。

​​​​​​​创建序列

【语法】

CREATE SEQUENCE <sequencen_name>

[INCREMENT BY n]

[START WITH n]

[MAXVALUE n][MINVALUE n]

[CYCLE|NOCYCLE]

[CACHE n|NOCACHE];

 

INCREMENT BY n --表示序列每次增长的幅度;默认值为1.

START WITH n --表示序列开始时的序列号。默认值为1.

MAXVALUE n --表示序列可以生成的最大值(升序).

MINVALUE n --表示序列可以生成的最小值(降序).

CYCLE --表示序列到达最大值后,在重新开始生成序列.默认值为 NOCYCLE。

CACHE n--允许更快的生成序列.预先生成n个序列值到内存(如果没有使用完,那下次序列的值从内存最大值之后开始;所以n不应该设置太大)

 

 

【示例】

--创建递增序列

create sequence seq_test

increment by 1

start with 1

maxvalue 1000

nocycle;

 

--创建递减序列

create sequence seq_test2

increment by -1

start with 5

maxvalue 5

minvalue 1

nocycle;

 

 

​​​​​​​序列使用

1、NEXTVAL 返回序列下一个值;第一次访问时,返回序列的初始值,后继每次调用时,按步长增加的值返回

【语法】

select <sequence_name>.nextval from dual;

 

【示例】

select seq_test.nextval from dual;

 

 

2、CURRVAL 返回序列的当前值.注意在刚建立序列后,序列的CURRVAL值为NULL,所以不能直接使用。使用过NEXTVAL访问序列后才能使用

【语法】查看序列的当前值

select <sequence_name>.currval from dual;

 

【示例】

select seq_test.nextval from dual;

select seq_test.currval from dual;

 

 

运用序列

-- 创建序列

create sequence seq_emp_empno

start with 1000

increment by 1

maxvalue 9000

minvalue 1000

nocycle;

 

-- 使用序列作为主键插入emp表的empno

insert into emp(empno,ename)

values(seq_emp_empno.nextval,'zx1');

insert into emp(empno,ename)

 values(seq_emp_empno.nextval,'zx2');

 

-- 查看emp表数据

select empno,ename from emp;

 

-- 查看当前序列的值

select seq_emp_empno.currval from dual;

 

 

--修改序列

alter sequence seq_emp_empno

maxvalue 9999

cycle;

 

 

​​​​​​​删除序列

 

【语法】

DROP SEQUENCE <sequence_name>

 

【示例】

drop sequence seq_test;

 

​​​​​​​序列sys_guid

sys_guid和序列都可以作为主键值。

--使用SYS_GUID函数,32位,由时间戳和机器标识符生成,保证唯一

select sys_guid() from dual;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值