每天都在工作,对于刚接触这一块的我来说,自己完全就是一个新人,完全是自己不熟悉的领域。今天又遇到了问题:
SELECT KF.IVR_OPER_MANYIDU_SEQ.nextval sts FROM DUAL;
这句代码啥意思?我在使用MySQl的时候,可没有看到过。后来查了点资料,总算搞明白了。
在这篇《MySQL数据类型和属性》中,说到了一个auto_increment
数据类型属性,对这个属性不清楚的伙计,可以先看看。Oracle中的序列和这个auto_increment
有点类似,但是Oracle提供的序列的功能比MySQL中的auto_increment
的功能强多了。
在Oracle中,使用序列实现字段的自增或自减。序列又叫序列生成器,它用于提供一系列的数字,我们使用序列生成唯一键,每次访问序列,序列按照一定的规律增加或者减少。序列的定义存储在SYSTEM表空间中,序列不像表,它不会占用磁盘空间(尽情的使用吧)。序列独立于事务,每次事务的提交和回滚都不会影响序列。
使用CREATE SEQUENCE
关键字来创建一个序列,例如:
CREATE SEQUENCE <sequence_name>
[INCREMENT BY n]
[START WITH n]
[{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{CACHE n | NOCACHE}]
[{ORDER | NOORDER}];
下面就给大家看一个我们生产服务器上的序列对象吧。使用下列语句查询序列的创建语句:
SELECT DBMS_METADATA.GET_DDL('SEQUENCE', u.object_name) FROM user_objects u WHERE object_type = 'SEQUENCE';
以下是我们生产库上的一个序列:
CREATE SEQUENCE "KF"."YJKF_TRANS_SWITCH_SEQ"
MINVALUE 1
MAXVALUE 999999999999999999999999999
INCREMENT BY 1
START WITH 1
CACHE 20
NOORDER
NOCYCLE
在本地测试库创建一个序列:
CREATE SEQUENCE "JELLY"."TEST_SEQ"
MINVALUE 1
MAXVALUE 9999999999999999999999999999
INCREMENT BY 1
START WITH 1
CACHE 10
NOORDER
NOCYCLE
当指定NOMAXVALUE
时,最大值就是9999999999999999999999999999。当创建好序列以后,我们可以使用ALTER
语句修改序列:
ALTER SEQUENCE <sequence_name>
[INCREMENT BY n]
[START WITH n]
[{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{CACHE n | NOCACHE}]
[{ORDER | NOORDER}];
由于使用序列生成的值是唯一的,我们一般都使用序列作为主键,当我们向表中插入一条数据时,就需要得到一个新的序列值,使用以下语句就能得到一条新的语句值:
SELECT test_seq.nextval FROM dual;
如果我们想查看当前的序列值,可以使用以下的语句:
SELECT test_seq.currval FROM dual;
每执行一次SELECT test_seq.nextval FROM dual;
语句,对应的序列值都会进行对应的增加。
每个会话执行currval之前,必须先执行nextval,否则就会产生错误。
当我们插入数据时,可以这样利用序列来当做主键值,进行插入:
INSERT INTO tb_student VALUES(student_id_seq.nextval, 'Kite', '男', 22);
当我们想把序列的值重新设置为起始值1时,你会发现,你根本没法办到。当你想使用ALTER
去修改序列的时候,会提示不允许修改START WITH
。那如果想把序列的值重新设置为起始值,怎么办?
没有更好的办法,只能使用以下的语句,把序列干掉,再重新建一个:
DROP SEQUENCE test_seq;
是的,我说过,没有更好的办法。只要你愿意,你可以干掉序列。
2015年6月2日 于呼和浩特。