Oracle實現自增列

jopen 9年前發布 | 14K 次閱讀 搜索技術 Oracle 數據庫服務器

首先創建一個序列(sequence) ,實現自增

-- Create sequence 
create sequence t_user_seq
minvalue 1 -- 最小值:1
nomaxvalue -- 沒有最大值
start with 1 -- 從1開始
increment by 1 --每次遞增1
nocache --不使用緩存 (也可設置為 cache n, 區別見本文最后附注部分)
order;


創建觸發器,在觸發器中使用之前創建好的sequence :t_user_seq

-- Create trigger 
create or replace trigger t_user_trigger
-- 在往表t_user中插入新數據之前觸發
before insert on t_user
for each row
begin
      select  t_user_seq.nextval
       -- 自增字段: user_id
      into:new.user_id
      from sys.dual ;
end;

 最后執行幾條insert 語句測試一下。

 

附注:

如果指定CACHE值,Oracle就可以預先在內存里面放置一些Sequence,這樣存取的快些。cache里面的取完后,Oracle自動再取一組到cache。使用cache或許會跳號, 比如數據庫突然不正常down掉(shutdown abort),cache中的Sequence就會丟失。舉個例子:比如你的sequence中cache 100,那當你sequence取到90時突然斷電,那么在你重啟數據庫后,sequence的值將從101開始。

如果指定NOCACHE值,Oracle就不會預先在內存里面存放Sequence,當然這也就可以避免數據庫不正常down掉的sequence丟失。不過會產生一些問題:創建nocache   sequence在高并發訪問時,容易導致row cache lock等待事件,主要原因是每次獲取nextval時都需要修改rowcache中的字典信息。使用nocache  sequence,還會導致如下問題:
由于每次修改字典信息都需要commit,可能導致log file sync等待,nocache sequence在RAC環境下,會對基于sequence生成的列創建的索引造成實例間大量索引塊爭用
基于以上問題,避免創建nocache sequence。

再來看看sequence相關保護機制:
row cache lock:在調用sequence.nextval情況下需要修改數據字典時發生,對應row cache lock事件
SQ lock:在內存緩存(并非rowcache)上獲取sequence.nextval時發生,對應enq:SQ-contention事件
SV lock:RAC環境下獲取cache+order屬性的sequence.nextval時發生,對應DFS lock handle事件

什么情況下使用cache什么時間上使用nocache?

我個人感覺應該盡量使用cache,因為現在的數據庫很多都是在高并發的情況下運行的,首先這樣可以搞性能,并且也不會產生row cache lock等待事件。可能有些人會擔心數據庫不正常的down掉會產生序列號間斷,但這也是很少的情況。當然如果你的業務要求是絕不能產生間斷的序列號,那就要使用nochache了。

 

參考:http://blog.csdn.net/duanning397/article/details/7670302

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!