文章詳情頁
Oracle中的序列SEQUENCE詳解
瀏覽:174日期:2023-03-12 15:25:03
一、序列介紹
Oracle的序列是一種數(shù)據(jù)庫對象,主要作用是用來產(chǎn)生唯一值。序列被創(chuàng)建以后可以通過數(shù)據(jù)字典找到序列對象,因此序列可以被多個對象共享。
二、創(chuàng)建序列
序列使用CREATE SEQUENCE語法進行創(chuàng)建:
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:定義序列的初始值(即產(chǎn)生的第一個值),默認為1。
- MAXVALUE:定義序列能生成的最大值。NOMAXVALUE是默認選項,代表沒有最大值,這時,對于遞增序列,系統(tǒng)能夠產(chǎn)生的最大值是10的27次方;對于遞減序列,最大值是-1。
- MINVALUE:定義序列能生成的最小值。NOMINVALUE是默認選項,代表沒有最小值,這時,對于遞減序列,系統(tǒng)能夠產(chǎn)生的最小值是負的10的26次方;對于遞減序列,最小值是1。
- CYCLE和NOCYCLE:表示當(dāng)序列生成器的值達到限制后是否循環(huán)。如果循環(huán),當(dāng)遞增序列達到最大值時,循環(huán)到最小值;對于遞減序列,達到最小值時,循環(huán)到最大值。如果不循環(huán),達到限制值后,繼續(xù)產(chǎn)生新值就會發(fā)生錯誤。
- CACHE:定義存放序列的內(nèi)存塊的大小,默認為20。NOCACHE表示不對序列進行內(nèi)存緩沖。對序列進行內(nèi)存緩沖,可以改善序列的性能。
例如:
CREATE SEQUENCE invoice_seq INCREMENT BY 1 START WITH 1 MAXVALUE 9999999 NOCYCLE NOCACHE;
三、查詢序列
一旦序列被創(chuàng)建,序列的創(chuàng)建代碼就被文本化在數(shù)據(jù)字典中,可以在user_objects數(shù)據(jù)字典中看到,如:
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:返回下一個可用的序列值,它每次返回一個唯一的被引用值,實際對不同的用戶也是如此。當(dāng)使用sequence.NEXTVAL時,一個新的序列數(shù)被產(chǎn)生并且當(dāng)前的序列數(shù)被放入CURRVAL。
- CURRVAL:獲得當(dāng)前的序列值。在首次使用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;
修改序列時,有如下幾個限制:
- 不能該表序列的起始值。
- 最小值不能大于當(dāng)前值。
- 最大值不能小于當(dāng)前值。
- 修改后的序列規(guī)則不會影響以前的序列值,只有未來的序列值會受到影響。
- 用戶必須具有ALTER SEQUENCE的權(quán)限。
六、刪除序列
DROP SEQUENCE invoice_seq;
七、創(chuàng)建自增序列
1、創(chuàng)建一個序列
create sequence sq_recid minvalue 1 maxvalue 999999 increment by 1 start with 1 noCYCLE;
2、創(chuàng)建一個觸發(fā)器
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"
到此這篇關(guān)于Oracle序列SEQUENCE的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持。
標(biāo)簽:
Oracle
相關(guān)文章:
1. 數(shù)據(jù)庫人員手冊之ORACLE應(yīng)用源碼2. 循序漸進講解Oracle數(shù)據(jù)庫管理員的職責(zé)3. Oracle數(shù)據(jù)庫備份與恢復(fù)之完全攻略4. Oracle常見問題集(一)5. 單機創(chuàng)建物理Oracle9istandby數(shù)據(jù)庫6. Oracle中鎖(lock)的用法7. [Oracle]Data Guard數(shù)據(jù)庫災(zāi)難防護8. Oracle 10g(10.1.0.2)中的OPTIMIZER_INDEX_COST_ADJ9. Oracle根據(jù)時間查詢的一些常見情況匯總10. Oracle 將發(fā)布免費數(shù)據(jù)庫?
排行榜
