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 |
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; |
二、Sequence的取值
Oracle、DB2、PostgreSQL中,Sequence的取值方法各有不同,不过都有当前值和下一个值的取法。取值代码如下
-- Oracle
代码如下 | 复制代码 |
SELECT seq_test.CURRVAL FROM DUAL; -- 当前值 SELECT seq_test.NEXTVAL FROM DUAL; -- 下一个值 |
-- DB2
代码如下 | 复制代码 |
VALUES PREVVAL FOR "seq_test"; -- 当前值 VALUES NEXTVAL FOR "seq_test"; -- 下一个值 -- 或 VALUES PREVIOUS VALUE FOR "seq_test"; -- 当前值 VALUES NEXT VALUE FOR "seq_test"; -- 下一个值 |
-- PostgreSQL
代码如下 | 复制代码 |
SELECT CURRVAL(seq_test); -- 当前值 SELECT NEXTVAL(seq_test); -- 下一个值 |
三、Sequence与indentity的区别与联系
Sequence与indentity的基本作用都差不多。都可以生成自增数字序列。Sequence是数据库系统中的一个对象,可以在整个数据库中使用,和表没有任何关系;indentity仅仅是指定在表中某一列上,作用范围就是这个表。