ORACLE SEQUENCE(序列)序列是用户创建的数据库对象,他可以有多个用户共享,用来生成唯一的整数。sequence属于某个用户。
序列号的存储和生成与表无关,因此,同一个序列可以用于多个表。但这样会引起应用的很多麻烦,因此,建议每个表都是用一个sequence(序列)
序列特性:1、自动生成唯一编号
2、是一个可共享的对象
3、通常用于创建主键值
4、替换应用程序代码
5、如果将序列高速缓存到内存中,则可以提高访问序列值的效率
创建序列语法
CREATE SEQUENCE sequence
[START WITH n]
[INCREMENT BY n]
[{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{CACHE n | NOCACHE}];
EX:
CREATE SEQUENCE employee_seq
START WITH 10000
INCREMENT BY 1
NOMAXVALUE
NOCYCLE
NOCACHE;
说明:如果指定CACHE值, oracle就可以预先在内存里面放置一些sequence,这样存取的快些。cache里面的取完后,oracle自动再取一组到cache。 使用cache或许会跳号,比如数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失. 所以可以在create sequence的时候用nocache防止这种情况。
序列相关数据字典
USER_OBJECTS
USER_SEQUENCES
EX:
SQL> SELECT object_name,object_name,status
FROM user_objects
WHERE lower(object_name)='employee_seq';
OBJECT_NAME OBJECT_NAME STATUS
-------------------------- ---------------------------- --------------
EMPLOYEE_SEQ EMPLOYEE_SEQ VALID
SQL> SELECT * FROM user_sequences
2 WHERE LOWER(SEQUENCE_NAME)='employee_seq';
SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY CY OR CACHE_SIZE LAST_NUMBER
--------------------------- ------------------ ----------------- ----------------------- ----- ----- ----------------------------- ----------------------
EMPLOYEE_SEQ 1 1.0000E+27 1 N N 20 10020
NEXTVAL和CURRVAL伪列
1、NEXTVAL会返回下一个可用的序列值。
2、CURRVAL会获得当前序列值。
3、第一次使用时必须对序列发出NEXTVAL,然后CURRVAL才能包含值,否则,oracle会抛出ORA-08002: sequence EMPLOYEE_name.CURRVAL is not yet defined in this session
EX:
SQL> SELECT employee_seq.nextval FROM dual;
NEXTVAL
-------------
10000
SQL> SELECT employee_seq.currval FROM dual;
CURRVAL
---------------
10000
使用NEXTVAL和CURRVAL的规则
可以在以下情况下使用:
1、不属于子查询一部分的SELECT 语句的SELECT 列表。
2、INSERT 语句中的子查询的SELECT 列表。
3、INSERT 语句的VALUES 子句。
4、UPDATE 语句的SET 子句。
不能再以下情况下使用:
1、视图的SELECT 列表。
2、带有DISTINCT关键字的SELECT 语句。
3、带有GROUP BY 、HAVING或ORDER BY 子句的SELECT 语句。
4、SELECT、DELETE或UPDATE语句中的子查询。
5、CREATE TABLE或ALTER TABLE语句中的DEFAULT表达式。
修改序列语法
ALTER SEQUENCE sequence
[INCREMENT BY n]
[{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{CACHE n | NOCACHE}];
修改序列的说明:
1、对序列具有ALTER权限。
2、修改只会影响以后发生的序列号。
3、如果要从不同的序号处重新开始,则不行删除原有的序列然后重新创建。
4、系统会执行一些验证操作。如:系统无法强加一个小于当前序号的新MAXVALUEF。否则抛出ORA-04009: MAXVALUE cannot be made to be less than the current value。
删除序列语法
DROP SEQUENCE sequence;
需要具备DROP (ANY) SEQUENCE权限。
[@more@]
1、不属于子查询一部分的SELECT 语句的SELECT 列表。
2、INSERT 语句中的子查询的SELECT 列表。
3、INSERT 语句的VALUES 子句。
4、UPDATE 语句的SET 子句。
不能再以下情况下使用:
1、视图的SELECT 列表。
2、带有DISTINCT关键字的SELECT 语句。
3、带有GROUP BY 、HAVING或ORDER BY 子句的SELECT 语句。
4、SELECT、DELETE或UPDATE语句中的子查询。
5、CREATE TABLE或ALTER TABLE语句中的DEFAULT表达式。
修改序列语法
ALTER SEQUENCE sequence
[INCREMENT BY n]
[{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{CACHE n | NOCACHE}];
修改序列的说明:
1、对序列具有ALTER权限。
2、修改只会影响以后发生的序列号。
3、如果要从不同的序号处重新开始,则不行删除原有的序列然后重新创建。
4、系统会执行一些验证操作。如:系统无法强加一个小于当前序号的新MAXVALUEF。否则抛出ORA-04009: MAXVALUE cannot be made to be less than the current value。
删除序列语法
DROP SEQUENCE sequence;
需要具备DROP (ANY) SEQUENCE权限。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/325751/viewspace-1048186/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/325751/viewspace-1048186/