之前項目中沒有系統使用過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個。這種情況也能會在數據庫關閉時也會導致序號不連續。