序列是Oracle数据库中特有的一个对象,用来生成一组等间隔的数值。
在Oracle中通常会使用序列生成一些唯一值(不重复的值),用来充当主键ID。
一个普遍被遵循的最佳实践是不要使用任何业务逻辑字段作为主键。主键应该是一个对用户和商业逻辑无意义的数据,这将非常方便地进行数据库的迁移、融合、架构调整,或者适应需求规则的一些改变。
最简单的创建序列的语法:
create sequence 序列名;
这样创建出来的序列,值默认从1开始,步长step为1。
取出的值:1、2、3、4、5、6、7、8、9、10……
创建一个从2开始,步长为2,最大值为40的序列:
create sequence 序列名
start with 2
increment by 2
maxvalue 40;
取出的值:2、4、6、8、10、12、14、16……
需要设置序列的属性,可以在创建序列的语句中,有选择地添加如下内容:
属性 | 作用 |
---|---|
INCREMENT BY n | 步长为n,每次增长n个大小 |
START_WITH n | 从n开始 |
MAXVALUE n | 最大值为n,超出了之后则无法继续获取数值 |
NOMAXVALUE | 没有上限,没有最大值 |
MINVALUE n | 最小值为n |
NOMINVALUE | 没有最小值 |
CYCLE | 循环,到了最大值之后会从头开始取。 |
NOCYCLE | 不循环,取完最大值之后就无法继续获取。 |
CACHE n | 在缓存里面放n个值 |
NOCACHE | 不使用缓存 |
删除序列:
drop sequence 序列名;
针对一个创建好的序列,我们主要的操作就是从它上面取值。
-
nextval 函数
返回序列中的下一个值。
nextval会引起序列的自增,每次调用获取的结果都不相同。
-
currval 函数
返回序列中当前的值。
不会引起序列的自增,每次调用的结果都相同。
注意:一个序列刚创建好的时候,第一次不能调用currval函数,因为还没有取过第一个值,没有被初始化。
假设,现在需要向s_student表中插入一些学生信息,使用序列自动生成id值。
学生信息:
tom 22岁 男
jack 23岁 男
lucy 24岁 女
首先,专门为这张表的ID字段创建一个序列:
create sequence stu_id_seq start with 1 increment by 1;
insert into s_student(id,name,age,gender) values(stu_id_seq.nextval,'tom',22,'male');
insert into s_student(id,name,age,gender) values(stu_id_seq.nextval,'jack',23,'male');
insert into s_student(id,name,age,gender) values(stu_id_seq.nextval,'lucy',24,'female');
insert into s_student(id,name,age,gender) values(stu_id_seq.nextval,'lily',22,'female');