在oracle中,可以使用序列自动生成一个整数序列,主要用来自动为表中的数据类型的主键列提供有序的唯一值,这样就可以避免在向表中添加数据时,手工指定主键值。而且使用手工指定主键值这种方式时,由于主键值不允许重复,因此它要求操作人员在指定主键值时自己判断新添加的值是否已经存在,这很显然是不可取的。
(1)创建序列
序列与视图一样,并不占用实际的存储空间,只是在数据字典中保存它的定义信息。创建序列需要使用create sequence语句,其语法如下:
create sequence [schema]。sequence_name –序列名
[ start with start_number ] –开始数字
[ increment by increment_number ] –每次加几
[ minvalue minvalue | nominvalue ] –最小值
[ maxvalue maxvalue | nomaxvalue ] –最大值
[ cache cache_number | nocache ]
[ cycle | nocycle ] –是否循环
[ order | noorder ];
注意:cache参数指定内存预分配的序列数的个数,默认20个,为了加快访问速度。
order参数指定是否按照请求次序生成序列号,一般使用序列生成主键值时,影响不大。
(2)序列中的两个伪列
currval:用于获取序列的当前值,必须再使用nextval一次之后才能使用。
—nextval:用于获取序列的下一个值,第一次使用返回的是初始值,向表中的主键赋值的时候使用此伪列。
(3)序列举例
首先创建student表:
create table student(
sid number(4) primary key,
sname varchar2(8) not null
);
创建student_seq序列
create sequence student_seq
start with 1
increment by 1
nocache nocycle order;
创建触发器(使用student_seq序列)
create trigger tr_student
before insert on student
for each row
begin
select student_seq into :new.sid from dual;
end;
插入数据:
sql> insert into student(sname) values(‘zhang’)
已创建 1 行。
sql> insert into student(sname) values(‘li’);
已创建 1 行。
sql> insert into student(sname) values(‘wang’)
已创建 1 行。
查询数据:
sql> select * from student;
sid sname
———- ——–
1 zhang
2 li
3 wang