如何在Oracle中使用Sequence

2021-04-06 21:47:01 字數 2114 閱讀 5356

sql server可以自增字段,但是oracle中在建表的時候可沒有這個選項,但是可以通過觸發器(trigger)或者序列(sequence)來實現,本文主要講述sequence。二者的區別oracle中自增字段的兩種方法的比較(trigger和sequence:

在oracle中,沒有象ms-sqlserver中那樣子有自增欄位,但是如果我們要實現這個功能,有2種方法

1 trigger

sql語句如下:

create or replace trigger trigger_name

before insert on your_sid.tablename

for each row

begin

declare

i number;

cursor cur is select max(id) from your_sid.tablename;

begin

open cur;

fetch cur into i;

if i is null then

:new.id := 0;  //可以根據實際需要來定初始值

else

:new.id := i + 1; //這裡以1遞增

end if;

close cur;

end;

end;

/其中:your_sid為資料庫的當前使用者sid,tablename為表名,id為列名,

2 sequence

sql語句如下:

create sequence your_sid.sequence_name

increment by 1  //指定序列以1遞增,如果沒指定,預設值1會使用

start with 1        //由1開始計數

nomaxvalue     //不設定最大值

minvalue 1      //設定最小值1

cache 20        //預分配快取大小為20

order

二者的區別在於,sequence的效率要比trigger的高,因為trigger每次都要遍歷表中所有記錄以尋找id最大值,而sequence每次執行後,都會保留最大值;

建立sequence的語法很簡單,如下

create sequence sequence_name

increment by 1 --表示從1開始計值

start with 1  --每次增長1

nomaxvalue / maxvalue 999999 --有兩個可選值,要麼無最大值,要麼指定最大值

minvalue 1 / nominvalue  --同maxvalue

cycle --表示達到最大值後從頭開始,也可以為nocycle

cache 10 --指定cache的值。如果指定cache值,oracle就可以預先在記憶體裡面放置一些sequence,這樣訪問的快些。cache裡面的取完後,oracle自動再取一組到cache。 使用cache或許會跳號, 比如資料庫突然不正常down掉(shutdown abort),cache中的sequence就會丟失. 所以可以在create sequence的時候用nocache防止這種情況。

order;--指定排序

序列提供兩個方法,nextval和currval。顧名思義,nextval為取序列的下乙個值,一次nextval會增加一次sequence的值;currval為取序列的當前值。例如,插入記錄時

insert tablename(id) values(sequence_id.nextval);--sequence_id為序列名

但是要注意的是:第一次nextval返回的是初始值;隨後的nextval會自動增加你定義的increment by值,然後返回增加後的值。currval總是返回當前sequence的值,但是在第一次nextval初始化之後才能使用currval,否則會出錯。

來個小插曲,我使用powerdesign進行資料庫設計,但是powerdesigner對oracle支援好像不是很好(或者那裡沒有設定好?),powerdesign會自動為序列名加上"",在oracle中雖然可以執行成功,也可以看到序列存在,但是如果執行select sequence_name.nextval from dual;會提示序列(名)不存在!所以大家在鍵序列的時候一定要注意哦

如何在Oracle中使用Sequence

sql server可以自增字段,但是oracle中在建表的時候可沒有這個選項,但是可以通過觸發器 trigger 或者序列 sequence 來實現,本文主要講述sequence。二者的區別oracle中自增字段的兩種方法的比較 trigger和sequence 建立sequence的語法很簡單,...

如何在oracle中使用DDL語句!

大家都知道觸發器是無需 commit 的,而且也不能寫 commit 觸發器和觸發它的 dml是同乙個事務 dml提交了,觸發器的操作也提交了,所以無需 commit 否則就會造成錯誤資訊。當然,如果你一定要在觸發器裡寫 commit 那也是可以的,可以用 oracle 中的自治事務來處理,自治事務...

如何在AndroidStudio中使用AIDL

本章節介紹如何在androidstudio中使用aidl 2.在aidl下建立乙個包,包裡建立乙個 aidl檔案,右鍵aidl new aidl aidl file 紅框就是建立完成後的樣子 3.在aidl檔案寫要被呼叫的方法,此方法不能有許可權修飾符 4.首先build下,然後建立乙個servic...