序列就是一组数字的队列。序列具有以下特征:
- 自动生成唯一编号;
- 是一个可共享的对象;
- 通常用于创建主键;
- 可替换应用程序中自增之类的相关代码;
- 如果将序列高速缓存放到内存中,则可以提高序列值访问效率,但是也增大了危险。一旦内存失效,那么序列缓存值就丢失了。
Oracle序列和MySql序列不一样。MySql序列可以在建表定义时一起定义,并且有插入自增的功能。但Oracle不行,Oracle序列必须以单独的数据对象出现。
创建序列
create sequence STU_ID_SEQ
increment by 20 -- 步进为20,默认值为1
start with 100 -- 起始值100,起始值并不意味着是最小值minvalue
maxvalue 1000 -- 最大值1000
minvalue 1
nocache -- 无缓存
nocycle; -- 无循环
NEXTVAL和CURRVAL
NEXTVAL会返回下一个可用的序列值,每次被引用时都返回一个唯一的值。
CURRVAL会返回当前序列值。
select STU_ID_SEQ.nextval from dual;
select STU_ID_SEQ.currval from dual;
使用序列
主键使用序列:
-- 创建students表
create table students
(
id number(6) constraint PK_STU_ID primary key,
name varchar2(30) not null,
sex varchar2(3) check(sex in ('F', 'M', 'F2M')),
birth char(10)
);
-- 插入数据
insert into students values(STU_ID_SEQ.nextval, '小红', 'F', '2022-01-01');
insert into students values(STU_ID_SEQ.nextval, '小强', 'M', '2022-03-01');
当将序列使用在表中时,如果想查询当前序号值,尽量不要使用“select STU_ID_SEQ.nextval from dual;”语句来查看,因为nextval会影响表后续的序号值。如果想查看,应该使用currval。
修改序列
alter sequence STU_ID_SEQ
increment by 1
start with 1
maxvalue 200
nocache
nocycle;
序列修改准则:
- 必须是序列的所有者才可以对序列实现ALTER权限;
- 修改只会影响之后的序列号;
- 如果从不同的序号处重新开始,则必须删除原有的序列后才可以重新创建。
- 系统会执行一些验证操作。
删除序列
drop sequence STU_ID_SEQ;
查看序列
-- 查看当前用户下的所有序列
select * from user_sequences;
-- 查看所有用户下的序列
select * from all_sequences;
-- 需要权限
select * from dba_sequences;