1. 程式人生 > >Oracle中的小序列

Oracle中的小序列

詳細信息 策略 rem 大學 odi 序列 註意 高效 步長

話說序列很少人知道,因為Mysql和sql server都有自動增長字段(如ID主鍵自動增長的整數),而Oracle卻沒有提供該用法,那麽Oracle提供了更加靈活方便的策略-建立對象序列

序列創建之後也是真真實實存在的,存在我們的磁盤上,並可以適用場合調用,序列總是從指定的長度開始,創建了之後可以按照指定步長進行累加,獲得新的整數

格式:

create sequence emp_seq

解釋:

創建一個序列,經常會用後綴seq來識別的

格式:

select object_name,object_type,status from user_objects where lower(object_name)='emp_seq';

解釋:

竟然是正兒八經存在的對象,那麽我們就可以通過數據庫user_objects.

格式:

select sequence_name,min_value,max_value,increment_by from user_sequences where lower(sequence_name)='emp_seq';

解釋:

用來查看我們創建的序列詳細信息的,我們通過這個突然發現,還能看最大值,最小值,每次增長的步長.

使用序列

創建不用等於白創,那麽使用前先要理解兩個值,第一個currval,第二個nextval,

從英語意思來看也很清晰,currval獲取當前值,nextval獲取下一個值,每次調用nextval都會使當前的序列增加單位步長(默認是1)

調用序列這兩個屬性方法為seq.currval和seq.nextval,第一次使用序列,註意哈,要先調用next的屬性,否則會報錯的!

格式:

select emp_seq.nextval from dual;

解釋:

我們用虛表dual來作為seq.nextval的from源,單行輸出顯示,這時候結果會是1.

因為nextval的值是默認整張的,所以我們要保證表ID為主鍵

格式:

alter table student_name modify(id number primary key);

格式:

insert into student(id,name) values(emp_seq,'你好',);

解釋:

假如student表中已有數據,我們插入id時候直接調用創建的序列你會驚奇的發現,失敗!!!怎麽回事,我們用select emp_seq.currval from dual;--發現數據是2,表中已經有2了當然不行了,怎麽辦也不可能把原有的數據(這一列刪除掉),數據量小還可以用用,麻煩不說,顯示不出序列的威力!下面我們介紹怎麽設置初始值,加入本表id值已經1000條數據,我們讓他從1000開始默認自增不是更好更高效!

格式:

drop sequence emp_seq;--刪除原來的序列

create sequence emp_seq start with 1001;

解釋:

關鍵詞start with 英語單詞理解就是起始,那麽意思就是說這個序列從1001開始自動增加(默認是1),插入的時候起始值是1001這樣就可以根據我們的需求來使用序列,是不是很方便簡單高效。

格式:

alter sequence emp_seq minvalue 8888;--修改最小值,註意當前修改的最小值不能大於原表中的數值(1001)!!

alter sequence emp_seq maxvalue 9999;--修改最大只

格式:

alter sequence emp_seq increment by 5;

解釋:

這就是我們前面一直給大家提到的默認增長的步調,就是說每一次插入id值默認自動增長多少。

這個地方要註意設置最大值的問題,如果我最大值是20的話,從1開始每次增加5,最大只能到17,第四次就會超出最大值報錯,這個的話大家一下就會明白。

那麽當我超出最大值就不可以,超出最大值就讓他變成最小值,重新循環,可以的,我們是操控者,只要我們願意,他就得可以,下面介紹一個關鍵字來替我們去執行這個操作。

格式:

create sequence emp_seq

start with 5

minvalue 1

maxvalue 30

incremenet by 1

/--創建結束

這時候我們算是吧前面學的參數都用上了,看一看其實也很簡單啊,麽點難度,我們開始多次nextval屬性值,直到用currval看當前值最大值為30,當我們在使用nextval的時候就會神奇的發現變成了1.

格式:

alter sequence emp_seq cycle;--開啟

alter sequence emp_sql nocycle;--關閉

緩存,什麽是緩存,緩存是更好的讀數據,速度比內存都要快很多,那麽序列也有緩存,大量數據能有緩存效果對於數據庫整體來說無疑是一個性能極大的提升。

那麽序列的cache,每次利用nextval,並非直接操作,而一次性獲取多個列表的緩存,從緩存中抓取數值,而且依賴於currval和步長increment.

定義存放序列的內存塊的大小,預先生成序列號,存放在內存塊當中,用下一個序號給予快速的相應,可以更快的響應,當一組用完之後會再生成一組,這樣可以提高生成序列號的效率,默認值20。

格式:

alter sequence emp_seq cache 10;

解釋:

設置緩存區大小

昨天在工作中,在表中添加了一個序列id,當時數據量比較小,利用表格然後插入到數據表列,如果數據量這個方法不可行而且特別麻煩,那麽今天學習的序列就派上了大用場!

小序列並不簡單,能用好、用到正地方確實要很大學問,希望大家一起學以致用多多實戰。


Oracle中的小序列