序列是用戶創建的數據庫對象,序列可以被多個用戶共享以產生唯一的整數。序列的一個典型的用途是創建一個主鍵的值,它對於每一行必須是唯一的。序列由一個 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= '用戶名';