Oracle序列學習與使用總結 by:授客 QQ:1033553122 簡述 序列是oracle提供的用於生成一系列數字的資料庫對象,序列會自動生成順序遞增的序列號,可用於提供唯一的自動遞增主鍵。序列和視圖一樣,並不占用實際的存儲空間,只是在數據字典中保存他的定義信息。 創建序列 當創建序列時必須擁 ...
Oracle序列學習與使用總結
by:授客 QQ:1033553122
簡述
序列是oracle提供的用於生成一系列數字的資料庫對象,序列會自動生成順序遞增的序列號,可用於提供唯一的自動遞增主鍵。序列和視圖一樣,並不占用實際的存儲空間,只是在數據字典中保存他的定義信息。
創建序列
當創建序列時必須擁有create sequence
或者 create any sequence
系統許可權。
CREATE SEQUENCE sequenceName //創建序列名稱
[INCREMENT BY n] //序列遞增值 如果n是正數就遞增,如果是負數則遞減 預設是1
[START WITH n] //序列起始值,遞增預設是minvalue 遞減是maxvalue
[{MAXVALUE n | NOMAXVALUE}] // 序列最大值
[{MINVALUE n | NOMINVALUE}] // 序列最小值
[{CYCLE | NOCYCLE}] // 是否迴圈,如果使用CYCLE,則當序列到達最大值(maxvalue)或者最小值(minvalue)時,重置序列起始值,並現有規則繼續生成序列值。如果使用NO CYCLE 選項,那麼在序列達到最大值或最小值之後,如果再試圖獲取下一個值將返回一個錯誤。
[{CACHE n | NOCACHE}] // 是否預先生成序列號,並存儲在記憶體中。n表示預生成的序列值個數。使用cache可能會跳號, 比如資料庫突然不正常關閉(shutdown abort),cache中的序列號就會丟失. 所以,為了避免這種情況,無特殊需求的話,使用NOCACHE
[order | noorder]; // 是否按序生成序列。order表示按序生成序列(比如第一個序列值1,第二個為2,以此類推),noorder表示不包裝序列值生成順序。
說明:[]
表示子句可選。
示例:
CREATE SEQUENCE orders_seq
increment By 1
start With 1
Maxvalue 2000
Minvalue 1
cycle
Nocache;
修改序列
類似創建序列,不過需要註意的是,不支持修改序列起始值。
示例:
ALTER SEQUENCE orders_seq
increment By 10
Maxvalue 3000;
使用序列
一旦創建了序列,就可以使用seqName.CURRVAL,seqName.NEXTVAL來分別獲取序列的當前值和下一個序列值。
可以使用序列的地方:
- INSERT的VALUES子句、子查詢
- 不包含子查詢、snapshot、視圖的 SELECT 語句中的列表
- UPDATE中的SET子句
不可以使用序列的地方:
-
子查詢、視圖和實體化視圖的查詢
-
帶DISTINCT的SELECT語句
-
帶 GROUP BY和ORDER BY的SELECT語句
-
帶UNION或INTERSECT或MINUS的SELECT語句
-
SELECT中的WHERE字句
-
CREATE TABLE與ALTER TABLE中的default值、check約束條件。
示例:
INSERT INTO MY_ORDER('ID', 'SEQ', 'ORDER_NO') VALUES(1, orders_seq.NEXTVAL, 'xdfkgdls20220821');
SELECT orders_seq.CURRVAL FROM DUAL;
註意:
- 第一次使用
seqName.NEXTVAL
返回的是序列的起始值;隨後的seqName.NEXTVAL
會自動增加你定義的INCREMENT BY
的值,然後返回增加後的值作為序列值。 seqName.NEXTVAL
初始化之後才能使用seqName.CURRVAL
刪除序列
DROP SEQUENCE seqName;
作者:授客
微信/QQ:1033553122
全國軟體測試QQ交流群:7156436
Git地址:https://gitee.com/ishouke
友情提示:限於時間倉促,文中可能存在錯誤,歡迎指正、評論!
作者五行缺錢,如果覺得文章對您有幫助,請掃描下邊的二維碼打賞作者,金額隨意,您的支持將是我繼續創作的源動力,打賞後如有任何疑問,請聯繫我!!!
微信打賞
支付寶打賞 全國軟體測試交流QQ群