oracle序列

    之前項目中沒有系統使用過oracle,只是簡單的使用,也沒有系統的看過oracle的書。這次換工作,現在公司所有項目都是使用oracle,所以也慢慢的瞭解了oracle的其他的內容,比如序列。

一、oracle序列

oracle主鍵沒有自增類型,所以一般使用序列產生的值作爲某張表的主鍵,實現主鍵自增。oracle是oracle用來生成一組等間隔的數值。序號的編號不像mysql在插入記錄的時候自動生成,必須調用序列的方法來生成,一般調用nextval方法。

二、創建語法

create sequence 序列名稱
[start with 初始量] 
[increment by 遞增量] 
[maxvalue 最大值| nomaxvalue] 
[minvalue 最小值| nominvalue] 
[cycle | nocycle] 
[cache 緩存個數| nocache];

start with:生成第一個序列號,對於升序列,其默認值爲序列最小值;對於降序序列,其默認值爲序列的最大值 。
increment by:用於指定序列號之間的間隔,其默認值爲1,如果integer爲正值,則生成的序列按升序排列,如果integer爲負值,則生成的序列將按降序排列。
maxvalue:序列可以生成的最大值。
nomaxvalue:oracle將升序序列的最大值設爲1027,將降序序列的最大值設爲-1.這是默認選項。
minvalue:minvalue必須小於或等於start with的值,並且必須小於maxvalue的值。
nominvalue:oracle將升序的最小值設爲1,或將降序序列的最小值設爲-1026.這是默認值。
cycle:序列在達到最大值或最小值後,將繼續從頭開始生成值。
nocycle:序列在達到最大值或最小值後,將不能再繼續生成值。不寫默認爲nocycle這是默認選項 。
cache:預先分配一組序列號,並將其保留在內存中,這樣可以更快地訪問序列號.當用完緩存中的所有序列號.oracle將生成另一組數值,並將其保留在緩存中。
nocache:不會加快訪問速度而預先分配序列號,如果在創建序列時忽略了cache和nocache,orcale將默認緩存20個序列號。

修改語法:
alter sequence 序列名稱
[start with 初始量] 
[increment by 遞增量] 
[maxvalue 最大值| nomaxvalue] 
[minvalue 最小值| nominvalue] 
[cycle | nocycle] 
[cache 緩存個數| nocache];

三、實例

創建:

create sequence seq_tb_person
minvalue 1
maxvalue 99999999999999
start with 1
increment by 1
cache 20;

使用:

insert into demo(id, username, age, password) values (seq_tb_demo.nextval, '張三', 20, 'zhang123')

一般在實際情況中通過建立觸發器,當有數據插入表時,使用oracle序列爲其去遞增主鍵

-- 創建觸發器
create or replace trigger trigger_set_person_id before insert on person
for each row
begin
    select seq_tb_person.nextval into :new.id from dual;
end;

修改序列:

alter sequence seq_tb_person
minvalue 1
maxvalue 999999999999999999
-- start with 49 對於已經啓動的序列,無法設置初始值
increment by 1
cache 20;

查看用戶序列:

select sequence_name, min_value, max_value, increment_by, last_number from user_sequences;

刪除序列:

drop sequence 序列名;

四、總結

一個序列可以被多張別使用,不過一般建議爲每個表建立單獨的序列。

當使用到序列的事務發生回滾。會造成序列號不連續。在用生成的序列值作爲編號做插入數據庫操作時,可能遇到事務提交失敗,從而導致序號不連續。

大量語句發生請求,申請序列時,爲了避免序列在運用層實現序列而引起的性能瓶頸。Oracle序列允許將序列提前生成 n個先存入內存,在發生大量申請序列語句時,可直接到運行最快的內存中去得到序列。但cache個數最好不要設置過大,因爲在數據庫重啓時,會清空內存信息,預存在內存中的序列會丟失,當數據庫再次啓動後,序列從上次內存中最大的序列號+1 開始存入n個。這種情況也能會在數據庫關閉時也會導致序號不連續。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章