Oracle学习 第10天
—— 序列(Sequence)
当在开发中,我们查询到一组数据,希望这组数据带有一列自增的编号时。
在MySQL数据库中,字段可以设置一种类型,AUTO_INCREMENT(自增)。当一个字段设置 AUTO_INCREMENT 类型后,给定一个初始的数字,之后每加入一条新的记录,该条记录的这个字段的值都会在原来的基础上加1。这个属性也经常和主键组合使用。
在SQLServer中,则拥有的是 IDENTIFY 属性,同样实现自增的功能,其拥有两个参数,即自增的最小值和最大值。
而在Oracle中,类似的功能我们就需要使用序列来完成。
创建序列
CREATE SEQUENCE mysequence -- 创建序列名称 START WITH 1 -- 开始值 INCREMENT BY 1 -- 增长值 MINVALUE 1 -- 最小值 MAXVALUE 100 -- 最大值 CYCLE -- 循环 CYCLE /不循环 NOCYCLE NOCACHE -- 缓存 CACHE /不缓存 NOCACHE -- 关于缓存:举例 CACHE 10 表示一次产生 10 个编号,提高计算效率,但不稳定。当一次产生10个号但并没有使用完而意外中断时,有可能会产生跳号现象。
Sequence 和 TABLE 等都属于数据对象,都可以在PLSQL 的 Object中直接查找到。
使用序列
序列一般情况下都是与主键或者其他具有唯一约束的列组合使用。
序列只能与NUMBER类型搭配使用,因为只有NUMBER类型才可以自增。
CREATE TABLE test1(userid NUMBER PRIMARY KEY , username VARCHAR2(20)); INSERT INTO test1 VALUES(mysequence.nextval,'Nick'); INSERT INTO test1 VALUES(mysequence.nextval,'John'); SELECT * FROM test1;
正常情况下,这里序列号应该为 1 和 2 。
因为初始值是 1 ,第一个NEXTVAL值是初始化值,第二个开始才按照规则自增。
但这里出现 2 和 3 。原因如下:
Oracle 11 版本之后,当Oracle新表使用序列作为 INSERT 值时,默认使用“延迟段” 功能。该功能是Oracle 11 之后的版本才具有。可以使用如下语句进行关闭:
ALTER 用户名 SET deferred_segment_creation = FALSE;
查看序列
SELECT mysequence.currval FROM dual;
查看某个序列当前增长到多少。
★ 注意:
序列是数据库对象,可以多个用户共享使用, 调用方法与TABLE的调用相同。
CURRVAL 功能 返回当前序列的值。但是,一定要在第一次 NEXTVAL 初始化之后才可以使用,否则会报错。
第一次 NEXTVAL 返回的是初始值(需要注意的是在Oracle11之后的版本中,直接插入序列时第一个NEXTVAL返回的有可能不是初始值,具体原因上面红字部分有解释)。
索引
索引最大的作用就是帮助用户极大的提升查询、分组、排序的效率。但同时也会占用很大的内存空间。
单列索引
CREATE INDEX 索引名 on 表名(列名);
复合索引
CREATE INDEX 索引名 on 表名(列名1, 列名2);
创建索引
CREATE TABLE TEST1(NAME VARCHAR2(20), JOB VARCHAR2(10), DEPTNO NUMBER); CREATE INDEX inx_name ON TEST1(NAME);
★ 注意:
刚刚说过,索引虽然能极大的提升查询的效率,但同时也占用很大的空间,降低数据增删改的效率。
并且,索引也需要定期单独的维护更新来保持和数据的一致性。
所以,不恰当的索引不但不会增加效率,反而会大幅度的降低系统的性能。
正确的创建索引对数据库的效率而言是非常重要的。
索引创建的
三大原则:
1、数据量越大的表,创建索引越有意义;
2、索引尽量创建在经常使用 WHERE 条件或连接条件 的列上;
3、索引创建的层次一般尽量不要超过 4 层;
★
逻辑性字段 、
字段值很少 和
很少引用 的字段尽量避免建立索引,否则很可能得不偿失。