ORACLE SEQUENCE

    技术2022-05-20  34

    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_seqSTART WITH 10000INCREMENT BY 1NOMAXVALUENOCYCLENOCACHE;说明:如果指定CACHE值,oracle就可以预先在内存里面放置一些sequence,这样存取的快些。cache里面的取完后,oracle自动再取一组到cache。 使用cache或许会跳号,比如数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失. 所以可以在create sequence的时候用nocache防止这种情况。序列相关数据字典 USER_OBJECTS USER_SEQUENCESEX: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 VALIDSQL> 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 10020NEXTVAL和CURRVAL伪列1、NEXTVAL会返回下一个可用的序列值。2、CURRVAL会获得当前序列值。3、第一次使用时必须对序列发出NEXTVAL,然后CURRVAL才能包含值,否则,oracle会抛出ORA-08002: sequence EMPLOYEE_name.CURRVAL is not yet defined in this sessionEX:SQL> SELECT employee_seq.nextval FROM dual;NEXTVAL-------------10000SQL> 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权限。

    最新回复(0)