Oracle、DB2、PostgreSQL之Sequence总结

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仅仅是指定在表中某一列上,作用范围就是这个表。