建表

建立一个傻乎乎的样例表,方便我讲解

1
2
3
4
create table employer(
ename varchar(10),
eid int primary key
);

建立序列

你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限,

1
2
3
4
5
6
CREATE SEQUENCE emp_sequence
INCREMENT BY 1 -- 自增量
START WITH 1 -- 起点
NOMAXvalue -- 无最大值
NOCYCLE -- 不循环
CACHE 10; --设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为---------NOCACHE

CACHE

年少无知的我以为是“开车”,其实是一个缓存池。 Buffer是用来写的,Cache是用来读的。一般的存储都有cache,为了提高性能,写操作在cache上完成就返回给OS了,我们称这种写操作为write back,为了保证掉电时cache中的内容不会丢失,存储都有电池保护,这些电池可以供存储在掉电后工作一定时间,保证cache中的数据被刷入磁盘,不会丢失。

这里可以弄明白cache和buffer

使用序列

插值

在emplyer中插入两行,一个是id为1的Alice,一个是id为2的Sccote

1
2
3
insert into employer values('Alice',emp_sequence.nextval);
insert into employer values('Sccote',emp_sequence.nextval);
select * from employer;

效果如下

emp_sequence.nextval 第一次使用时是起点值,之后每一次使用会把emp_sequence.currval的值加一后调用,类似与c++中的++i

查看值

1
2
3
select emp_sequence.currval from dual;--当前值
select emp_sequence.nextval from dual;--下一个的值
select emp_sequence.currval from dual;

聪明的你发现currval变成了3,因为他自加了!!!!
当你加入第三条数据

1
2
insert into employer values('处女座',emp_sequence.nextval);
select * from employer;

就变成了
效果如下

处女座

其实,一般来说标识属性不连续也没关系,只要不重复就行,可是处女座就看不下去了
如果要改变sequence的值变成3,可以有以下两种方法。

Alter

把序列自增为-2,执行一次nextval,然后在把自增改为1.好几把蛋疼!

1
2
3
4
5
6
7
8
ALTER SEQUENCE emp_sequence
INCREMENT BY -2;
select emp_sequence.nextval from dual;--下一个的值
select emp_sequence.currval from dual;
ALTER SEQUENCE emp_sequence
INCREMENT BY 1;

再drop掉“处女座”,重写添加处女座

1
2
3
4
Delete from employer
Where eid=4;
insert into employer values('处女座',emp_sequence.nextval);
select * from employer;

效果如下

DROP

删除序列,然后在重建一个从3开始的。则更几把蛋疼。

1
drop sequence emp_sequence;

蛋疼

可能是西裤有点紧吧,蛋蛋疼了一天了。
若果你语句有一个语法错误,比如

1
insert into employer values(处女座,emp_sequence.nextval);--少引号

数据是没有加入,但是序列的值它加加了!!!!!!
这尼玛让不让处女座的活了?
~
~
~
~
~
~
~
hiahiahia,然而我是双鱼座的。

求助

帮帮忙