網站首頁 編程語言 正文
一、序列介紹
Oracle的序列是一種數據庫對象,主要作用是用來產生唯一值。序列被創建以后可以通過數據字典找到序列對象,因此序列可以被多個對象共享。
二、創建序列
序列使用CREATE SEQUENCE語法進行創建:
CREATE SEQUENCE sequence
[INCREMENT BY n]
[START WITH n]
[{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}]
[{CYCLE | NOCYCLE}]
[{CACHE n | NOCACHE}];
- NCREMENT BY:用于定義序列的步長,如果省略,則默認為1,如果是負值,則代表序列的值是遞減的。
- START WITH:定義序列的初始值(即產生的第一個值),默認為1。
- MAXVALUE:定義序列能生成的最大值。NOMAXVALUE是默認選項,代表沒有最大值,這時,對于遞增序列,系統能夠產生的最大值是10的27次方;對于遞減序列,最大值是-1。
- MINVALUE:定義序列能生成的最小值。NOMINVALUE是默認選項,代表沒有最小值,這時,對于遞減序列,系統能夠產生的最小值是負的10的26次方;對于遞減序列,最小值是1。
- CYCLE和NOCYCLE:表示當序列生成器的值達到限制后是否循環。如果循環,當遞增序列達到最大值時,循環到最小值;對于遞減序列,達到最小值時,循環到最大值。如果不循環,達到限制值后,繼續產生新值就會發生錯誤。
- CACHE:定義存放序列的內存塊的大小,默認為20。NOCACHE表示不對序列進行內存緩沖。對序列進行內存緩沖,可以改善序列的性能。
例如:
CREATE SEQUENCE invoice_seq
INCREMENT BY 1
START WITH 1
MAXVALUE 9999999
NOCYCLE NOCACHE;
三、查詢序列
一旦序列被創建,序列的創建代碼就被文本化在數據字典中,可以在user_objects數據字典中看到,如:
SELECT object_name,object_id,object_type FROM user_objects WHERE object_name = 'INVOICE_SEQ';
在user_sequences表中保存了序列明細信息:
SELECT sequence_name, min_value, max_value, increment_by, last_number FROM user_sequences;
四、使用序列
NEXTVAL和CURRVAL偽列
- NEXTVAL:返回下一個可用的序列值,它每次返回一個唯一的被引用值,實際對不同的用戶也是如此。當使用sequence.NEXTVAL時,一個新的序列數被產生并且當前的序列數被放入CURRVAL。
- CURRVAL:獲得當前的序列值。在首次使用NEXTVAL之前就使用CURRVAL的話,會報錯。
使用如下 :
SELECT invoice_seq.CURRVAL,invoice_seq.NEXTVAL FROM DUAL;
INSERT INTO invoice (invoice_id, vendor_id, invoice_number, invoice_total )
VALUES (invoice_seq.NEXTVAL, 10, 'INV' || invoice_seq.CURRVAL, 100 );
可以在下面的上下文中使用NEXTVAL和CURRVAL:
- 不是子查詢的一部分的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表達式。
另外要注意,ROLLBACK并不能使序列值回滾。
五、修改序列
如:
ALTER SEQUENCE invoice_seq INCREMENT BY 2 MAXVALUE 10 NOCACHE NOCYCLE;
修改序列時,有如下幾個限制:
- 不能該表序列的起始值。
- 最小值不能大于當前值。
- 最大值不能小于當前值。
- 修改后的序列規則不會影響以前的序列值,只有未來的序列值會受到影響。
- 用戶必須具有ALTER SEQUENCE的權限。
六、刪除序列
DROP SEQUENCE invoice_seq;
七、創建自增序列
1、創建一個序列
create sequence sq_recid
minvalue 1 maxvalue 999999 increment by 1 start with 1 noCYCLE;
2、創建一個觸發器
create or replace trigger trg_test
before insert on test for each row
begin
select sq_recid.nextval into :new.ID from dual;
end;
alter trigger trg_test enable;
3、在C#中也可以手工插入序列到表中
string sql="insert into test(ID,otherCol)value (Sql_recid.nextval,***)
retuing ID into :ID"
原文鏈接:https://www.cnblogs.com/springsnow/p/11547425.html
相關推薦
- 2022-05-15 Python語言實現二分法查找_python
- 2022-07-26 ES對比兩個索引的數據差
- 2023-07-02 如何遠程使用服務器上的Jupyter?notebook_python
- 2023-11-22 fatal: unable to access ‘https://github.com/xxxxx/
- 2022-06-10 C#關鍵字Check簡單介紹_C#教程
- 2021-11-10 Android?Studio設置繪制布局時的視圖_Android
- 2022-03-05 C#多線程用法詳解_C#教程
- 2022-10-03 Android使用AudioRecord實現錄音功能_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支