sequence


    序列是用户创建的数据库对象,序列可以被多个用户共享以产生唯一的整数。序列的一个典型的用途是创建一个主键的值,它对于每一行必须是唯一的。序列由一个 Oracle 内部程序产生并增加或减少。序列是一个节省时间的对象,因为它可以减少应用程序中产生序列程序的代码量。序列号独立于表被存储和产生,因此,相同的序列可以被多个表使用。

语法:
CREATE SEQUENCE Sequence_name
[INCREMENT BY n]                ---指定序列号增量,n是一个整数(如果省略,序列增量为1)
[START WITH n]                     ---默认从1开始
[{MAXVALUE n| NOMAXVALUE}]                 ---升序最大值为10^27,降序最大值为-1
[{MINVALUE n| NOMINVALUE}]               ---升序最小值为1,降序最小值-(10^26)
[{CYCLE | NOCYCLE}]          ---是否循环,默认nocycle
[{CACHE n| NOCACHE}];                ---预先分配多少值,默认20

ORDER|NOORDER 选项可用,ORDER 选项保证序列值按顺序产生,如果你将序列用于产生主键值它是不重要的,该选项仅与 Parallel Server(并行服务)选项有关。默认noorder

CREATE SEQUENCE dept_deptid_seq
INCREMENT BY 10
START WITH 120
MAXVALUE 9999
Nocache
NOCYCLE;

查看序列

select object_name,object_id,object_type From USER_OBJECTS Where object_name = 'DEPT_DEPTID_SEQ';
col sequence_name for a20
select * From USER_SEQUENCES Where sequence_name = 'DEPT_DEPTID_SEQ';

---获取创建seq ddl
select DBMS_METADATA.GET_DDL('SEQUENCE','SEQUENCENAME') from DUAL;

 

nextval、currval使用规则:

可以在下面的上下文中使用 NEXTVAL 和 CURRVAL:

  • 一个不是子查询的一部分的 SELECT 语句的 SELECT 列表
  • 在一个 INSERT 语句中子查询的 SELECT 列表
  • 一个 INSERT 语句中的 VALUES 子句
  • 一个 UPDATE 语句的 SET 子句

不能在下面的上下文中使用 NEXTVAL 和 CURRVAL:

  • 一个视图的 SELECT 列表
  • 一个带 DISTINCT 关键字的 SELECT 语句
  • 一个带 GROUP BY、HAVING 或 ORDER BY 子句的 SELECT 语句
  • 一个在 SELECT、DELETE 或 UPDATE 语句中的子句
  • 在 CREATE TABLE 或 ALTER TABLE 语句中的 DEFAULT 表达式
SQL> SELECT dept_deptid_seq.nextVAL FROM dual;

   NEXTVAL
----------
       120

SQL> SELECT dept_deptid_seq.CURRVAL FROM dual;

   CURRVAL
----------
       120

修改序列

ALTER SEQUENCE dept_deptid_seq INCREMENT BY 20 MAXVALUE 999999 cache 100;
---START WITH 选项不能被改变

DROP SEQUENCE dept_deptid_seq;

 序列迁移

SELECT 'drop SEQUENCE ' || SEQUENCE_NAME || ';CREATE SEQUENCE ' ||
       SEQUENCE_NAME || ' INCREMENT BY ' || INCREMENT_BY || ' START WITH ' ||
       LAST_NUMBER || ' MAXVALUE ' || MAX_VALUE || ' ' || (case
         when CACHE_SIZE = 0 then
          'NOCACHE'
         else
          'CACHE ' || CACHE_SIZE
       end) || ' ORDER NOCYCLE ;'
  FROM dba_SEQUENCES where sequence_owner= '用户名';

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM