Sequence是資料庫系統按照一定規則自動增加的數字序列。這個序列一般作為代理主鍵(因為不會重複),沒有其他任何意義。
Sequence是資料庫系統的特性,有的資料庫有Sequence,有的沒有。比如Oracle、DB2、PostgreSQL資料庫有Sequence,MySQL、SQL Server、Sybase等資料庫沒有Sequence。
根據我個人理解,Sequence是資料中一個特殊存放等差數列的表,該表受資料庫系統控制,任何時候資料庫系統都可以根據目前記錄數大小加上步長來擷取到該表下一條記錄應該是多少,這個表沒有實際意義,常常用來做主鍵用,非常不錯,呵呵,不過很鬱悶的各個資料庫廠商尿不到一個壺裡--各有各的一套對Sequence的定義和操作。在此我對常見三種資料庫的Sequence的定義和操作做一個對比和總結,以便日後查看。
一、定義Sequence
定義一個seq_test,最小值為10000,最大值為99999999999999999,從20000開始,增量的步長為1,緩衝為20的迴圈排序Sequence。
Oracle的定義方法:
create sequence seq_test
minvalue 10000
maxvalue 99999999999999999
start with 20000
increment by 1
cache 20
cycle
order;
DB2的寫法:
create sequence seq_test
as bigint
start with 20000
increment by 1
minvalue 10000
maxvalue 99999999999999999
cycle
cache 20
order;
PostgreSQL的寫法:
create sequence seq_test
increment by 1
minvalue 10000
maxvalue 99999999999999999
start 20000
cache 20
cycle;
二、Oracle、DB2、PostgreSQL資料庫Sequence值的引用參數為:currval、nextval,分別表示當前值和下一個值。下面分別從三個資料庫的Sequence中擷取nextval的值。
Oracle中:seq_test.nextval
例如:select seq_test.nextval from dual;
DB2中:nextval for SEQ_TOPICMS
例如:values nextval for seq_test;
PostgreSQL中:nextval(seq_test)
例如:select nextval(seq_test);
三、Sequence與indentity的區別與聯絡
Sequence與indentity的基本作用都差不多。都可以產生自增數字序列。
Sequence是資料庫系統中的一個對象,可以在整個資料庫中使用,和表沒有任何關係;indentity僅僅是指定在表中某一列上,作用範圍就是這個表。