序列
序列(Sequence)和同义词(Synonym)
序列的引入:
序列Sequence有什么特点?
它是一个可以由多个用户共享的数据库对象
它是一个序列号产生器,专门为表中的数据行自动产生序列号
序列号是Oracle内部例程产生和维护的
它独立于使用它的表
它通常是用来产生主键
它可以取代产生序列号的应用程序
如果让它常驻内存,可提高访问序列号的效率
创建序列号Sequence的语句格式:
CREATE SEQUENCE 序列号的名字
[START WITH n]
[INCREMENT BY n]
[{MAXVALUE n|NOMAXVALUE}]
[{MINVALUE n|NOMINVALUE}]
[{CHARE n|NOCACHE}]
[{CYCLE n|NOCYCLE|CYCLE 20}]
其中:
序列号的名字:为序列号产生器的名字
START WITH n:定义了所产生的第一个序列号码,这里n为整数。如果该子句省略,序列号从1开始。
INCREMENT BY n:定义了序列号增加步长(序列号之间的间隔)。如果该子句省略,序列号增加步长为1
MAXVALUE n:定义了可产生的序列号的最大值
NOMAXVALUE:说明升序的序列号的最大值为10的27次方,而降序的序列号的最大值为-1(这也是默认值)
MINVALUE n:定义了可产生的序列号的最小值
NOMINVALUE:说明肾虚的序列号的最小值为1,而降序的序列号的最小追为负10的26次方(这也是默认值)
CACHE n:说明将有n个序列号码被Oracle服务器预分配和保存在内存中
NOCACHE:说明将没有序列号被Oracle服务器预分配和保存在内存中
CACHE 20:这是默认值,您不用说明
CYCLE n:说明序列号达到最大值或最小值后,将继续产生序列号
NOCYCLE:说明序列号达到最大值或者最小值后,将不再产生序列号(这也是默认值)
创建序列例子:
CREATE SEQUENCE supplier_s_code
START WITH 2000
INCREMENT BY 10
MAXVALUE 100000
NOCACHE
NOCYCLE;
查看序列信息:
两种方式:
user_sequences数据字典:
SELECT sequence_name, min_value, max_value, increment_by, last_number
FROM user_sequences;
user_objects数据字典:
SELECT object_name, object_type, created, last_ddl_time, status
FROM user_objects
WHERE object_type != 'TABLE'
AND object_type != 'INDEX';
如何使用创建序列号
两个伪列:
NEXTVAL 返回序列号的下一个可获得的值
CURRVAL 获得序列号的当前值
可以使用伪表dual协助
SELECT supplier_s_code.CURRVAL
FROM dual;
Oracle规定:在引用CURRVAL之前,必须在当前的会话下(账号中)使用NEXTVAL产生一个序列号的值
使用序列的例子:
INSERT INTO ord(ordno, p_code, s_code, ordate, unit, price)
VALUES (ord_ordno.NEXTVAL, 881, supplier_s_code.CURRVAL, SYSDATE, 10, 2.5);
INSERT INTO ord(ordno, p_code, s_code, ordate, unit, price)
VALUES (ord_ordno.CURRVAL, 882, supplier_s_code.CURRVAL, SYSDATE, 15, 6.12);
在这样的DML语句中插入数据时,要使用伪劣CURRVAL,而不能使用NEXTVAL,因为NEXTVAL后会造成所引用的序列号的值变化。
如果您仔细观察一下刚刚创建的两个序列号,您就会注意到在创建它们时都使用了NOCYCLE子句(这也是默认值)。虽然Oracle允许您在创建序列号时使用CYCLE子句,但是应该尽量少用,特别时用序列号来产生主键时。如果不得不用,您必须建立一种清除旧的主键的机制,从而使得旧的主键清除的速度比循环(CYCLE)的速度快。
NEXTVAL和CURRVAL伪列介绍和它们的使用规则
NEXTVAL和CURRVAL来引用序列号注意的特点:
利用伪列NEXTVAL来得到所定义的序列号(产生器)的下一个序列号码
在使用伪列NEXTVAL时,必须在NEXTVAL之前冠以所定义的序列号
当引用序列号.NEXTVAL时,必须在NEXTVAL之前冠以所定义的序列号
当引用序列号.NEXTVAL时,将产生一个新的序列号吗,并且这个新的序列号吗被放到CURRVAL伪列中
用伪劣CURRVAL来引用刚刚产生的序列号码
在引用CURRVAL之前,您一定在当前的会话账号中使用NEXTVAL产生一个序列号码
您可以使用NEXTVAL和CURRVAL的情况如下:
在查询语句的SELECT子句中,但不包括子查询中的SELECT子句
在UPDATE语句的SET子句
在INSERT语句中的子查询SELECT列表中
在INSERT语句的VALUES子句中
您不能使用NEXTVAL和CURRVAL的情况如下:
在视图的SELECT子句中
在查询(SELECT)语句的子查询中
在UPDATE语句的子查询中
在DELETE语句的子查询中
在包含DISTINCT关键字的查询(SELECT)语句中
在包含GROUP BY 子句的查询语句中
在包含GROUP BY子句的查询语句中
在包含HAVING子句的查询语句中
在包含DEFAULT表达式的CREATE TABLE语句中
在包含DEFAULT表达式的ALTER TABLE语句中
如果某个序列号时多个用户共享的,而且访问的频率很好,为了加快访问该序列号的速度,您可以将它存在内存中。但是这样做的副作用是序列号码有时可能产生间隔的序列号码。
利用CREATE SEQUENCE语句的CACHE n子句来说明某个序列前n个值将被放入内存中。Oracle服务器的操作包括:
1、在第一次引用这个序列号时,Oracle服务器计算出n个序列号吗并将它们存放入内存
2、每一个要求下一个序列号码的请求都从在内存中的序列号码得到
3、当内存中的最后一个序列号码用完后而又受到下一个请求时,Oracle服务器再计算出n个序列号码并将它们放入内存
序列间隔导致原因:
当使用该序列号的事务被回滚时
当该序列号还用于另外的表时
当系统崩溃时
序列号的修改
例子:
ALTER SEQUENCE supplier_s_code
INCRENEBR BY 11
MAXVALUE 999999
CACHE 50;
可以通过数据字典user_sequence查看所做的修改是否已经记录到系统中,例如:
SELECT sequence_name, min_value, max_value, increment_by, last_number, cache_size
FROM user_sequences;
修改序列号不会影响之前的数据
修改序列的语法格式:
ALTER SEQUENCE 序列号的名字
[INCREMENT BY n]
[{MAXVALUE n|NOMAXVALUE}]
[{MINVALUE n|NOMINVALUE}]
[{CACHE n|NOCACHE}]
[{CYCLE n|NOCYCLE}];
下面是一些在修改序列号时需要注意的事项:
您必须是序列号的拥有者或具有ALTER ANY SEQUENCE 的系统权限
您不能修改START WITH选项,您只能通过将该序列号删除掉,之后再来重建达到这一目的
ALTER SEQUENCE 只影响以后的序列号码
在做修改之前,Oracle系统要执行一些检查。如修改后的MAXVALUE不能小于序列号的当前值
删除序列号:
例子:
DROP SEQUENCE supplier_s_code;
删除序列号语句的格式如下:
DROP SEQUENCE 序列号的名;
为什么我们建的序列号没有一个从1或者从0开始的,为什么?
因为一般商务公司或者机构都希望向外界传递一种生意蒸蒸日上的而信息,反映在订单上或发票上号码很大,从而使得客户或者供应商认为该公司的生意太繁忙了。

浙公网安备 33010602011771号