序列是用户创建的数据库对象,序列可以被多个用户共享以产生唯一的整数。序列的一个典型的用途是创建一个主键的值,它对于每一行必须是唯一的。序列由一个 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= '用户名';