數據庫sequence的作用和用法


轉:

數據庫sequence的作用和用法

seqence的作用:

sequence號是數據庫系統按照一定規則自增的數字序列,因為自增所以不會重復。目前就我所了解的sequence的作用主要有兩個方面。

一:作為代理主鍵,唯一識別;

二:用於記錄數據庫中最新動作的語句,只要語句有動作(I/U/D等),sequence號都會隨着更新,所以我們可以根據sequence號來select出更新的語句。

sequence的用法:

sequence和創表類似,需要創建一個sequence,然后表的一個int型字段可以使用這個sequence。

創建一個sequence(db2,oracle均適用)

create seqence sequence_name 

[start with n1] 

[increment by n2] 

[maxvalue n3|no maxvalue] 

[minvalue n4|no minvalue] 

[cache n5|no cache] 

[cycle|no cycle] 

[order|no order]

----------------->n1到n5都是整數

----------------->start with 生成的第一個n1值

-----------------> increment by n2 遞增量,可以為正整數或負整數,指明每一次增加多少

----------------->maxvalue最大值,no maxvalue用於指定序列沒有上限

----------------->minvalue 最小值,no minvalue,沒有指定最小下限

----------------->cache 用高速緩存中可以預分配的序列號個數,默認是20。 如果緩存中的序列號沒有用完就關閉數據庫等其它原因. 沒有使用的序列號就丟失了,所以不能保證序列號是連續的。nocache高速緩沖中不預分配序列號,每次只生成一個序列號,雖然降低了獲取序列號的速度,但是可以保證序列號的連續性。

----------------->cycle 序列達到最大值或最小值后是否循環。再從n1開始循環,默認不no cycle

----------------->order用於指定按順序生成序列,只有在RAC時需要指定,指定ORDER 是為了保證序列號是因為有請求才生成的。在使用序列號做為一個時間戳時很有用,no order是不指定按順序生成序列(默認)。

創建一個sequence:

create sequence sequence_name as int minvalue 1000 maxvalue 1000000000 start with 1000 increment by 1 no cache;

或者

create sequence sequence_name minvalue 1000 no maxvalue start with 1000 increment by 1 no cache;

sequence的使用:

sequence_name.nextval ------->引用下一個序列值

sequence_name.currval /seqence_name.nextval.currval -------->引用當前序列值,必須最少經過一個nextval才能引用currval

在表中使用sequence:

create table tab_name(col_int int, col_varchar varchar(20), col_seq int);

insert tab_name into values(1, 'abc', nextval for sequence_name);   或者 insert tab_name into values(1, 'xyz', sequence_name.nextval);

insert tab_name into values(2, 'fgh', nextval for sequence_name);   或者 insert tab_name into values(2, 'fgh', sequence_name.nextval);

update tab_name set col_varchar='678', col_seq=sequence_name.nextval where col_int=2; 

delete tab_name col_sql=sequence_name.nextval where col_int=1;

單獨使用查詢sequence:

select sequence_name.nextval from dual; ------>每執行一次sequence號會一直增加

select sequence_name.currval from dual; ------->執行多少次都不會變化

改變sequence:

比如對以上創建的sequence除了初始值以外的值進行修改,alter sequence_name minvalue 100000 maxvalue 99999999 increment by 10 cache 10 cycle;

刪除sequence:

drop sequence sequence_name;

 

利用解發器自動為表插入遞增序列:---類似自增字段的作用

建解發器代碼為:
create or replace trigger trigger_id
before insert on tabname
for each row
declare
nextid number;
begin
IF :new.col_seq IS NULL or :new.col_seq=0 THEN
select sequence_name.nextval
into nextid from sys.dual;
:new.col_seq:=nextid;
end IF;
end trigger_id;

或者

create trigger trigger_id before
insert on tabname
for each row 

begin
select sequence_name.nextval 
into:new.col_seq 
from dual;
end trigger_id;

或者

create or replace trigger trigger_id
before insert or update of col_seq
on tabname
for each row
begin
if inserting then
select sequen_name.nextval into:new.col_seq from dual;
slse
raise_application_error(-20020, '不允許更新ID值!');
end if;
end;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM