序列对象(也叫序列生成器)就是用CREATE SEQUENCE 创建的特殊的单行表。一个序列对象通常用于为行或者表生成唯一的标识符。
一、Oracle数据库
1、创建序列
- SQL> CREATE SEQUENCE name [INCREMENT BY n]
- [START WITH n] [{MAXVALUE n | NOMAXVALUE}]
- [{MINVALUE n | NOMINVALUE}] [{CYCLE | NOCYCLE}]
- [{CACHE n | NOCACHE}]
2、查询序列
(1)查询下一个将要使用的序列
- select SEQ_NAME.nextval from dual
(2)查询当前序列
- select SEQ_NAME.currval from dual
使用这条语句的时候要特别注意,因为在使用currval之前,必须先使用nextval,否则就会异常;而且,必须在同一个连接内,先使用nextval之后,才能使用currval。如果使用了nextval,然后断开了连接;重新连接后使用currval仍然会异常。
(3)查询序列详细信息(Oracle对于不同用户创建的Sequence是隔开的,所以也可以不用传入用户名)
- select SEQUENCE_OWNER,SEQUENCE_NAME from dba_sequences where sequence_owner='用户名';
- Oracle将sequence的定义存储在数据字典之中。
- Sequence是独立于事务的,就是说序列的增加不需要等待事务的完成,也就是说序列是异步于事务而增长的。这说明,你访问不到别的用户使用该sequence产生的值,也就是说你只能访问到你当前产生的值,即使其他用户已经增加了sequence的值;还说明如果事务回滚,sequence不会回滚,它所发生的改变是一维的。
3、更改序列
- SQL> ALTER SEQUENCE sequence [INCREMENT BY n] [{MAXVALUE n | NOMAXVALUE}]
- [{MINVALUE n | NOMINVALUE}]
- [{CYCLE | NOCYCLE}] [{CACHE n | NOCACHE}];
注意: 不能改变它的起始值(但是有其他的方法实现这一功能,参见最后Oracle和DB2差异比较)
如果要改变序列的起始值, 先把序列号删除掉, 再新建一个。
4、删除序列
- SQL>DROP SEQUENCE sequence;
5、Oracle数据字典
- 数据字典表所有者是sys用户,其数据字典表和数据字典视图都保存在system表空间中。除sys用户,任何用户(包括DBA)都不能直接更改数据字典,但可以查询其中的信息,即数据字典是只读的。
- 数据字典分为静态数据字典和动态数据字典。
- 静态数据字典:是指在用户访问数据字典时内容不会发生改变,这类数据字典主要是由表和视图组成,数据字典中的表是不能被直接访问的,但是可以访问数据字典中的视图,静态数据字典中的视图分为三类,分别有三个前缀构成:user_*,all_*,dba_*。
- 动态数据字典:Oracle包含了一些潜在的由系统管理员如SYS维护的表和视图,由于数据库运行时它们会不断更新,因此称它们为动态数据字典。
二、DB2数据库
1、创建序列
- CREATE SEQUENCE <sequence-name>
- AS data-type 默认 As Integer
- START WITH <numeric-constant>
- INCREMENT BY <numeric-constant> 默认 INCREMENT BY 1
- MINVALUE <numeric-constant> | NO MINVALUE 默认 NO MINVALUE
- MAXVALUE <numeric-constant> | NO MAXVALUE 默认 NO MAXVALUE
- NO CYCLE | CYCLE 默认 NO CYCLE
- CACHE <numeric-constant> | NO CACHE 默认 CACHE 20
- NO ORDER | ORDER 默认 NO ORDER
2、查询序列
(1)查询下一个将要使用的序列
- select nextval for seq_name from sysibm.sysdummy1;
(2)查询当前序列
- select prevval for seq_name from sysibm.sysdummy1;
(3)查询序列详细信息(当前用户,current user表示当前连接的用户,相当于内置变量)
- SELECT * FROM syscat.sequences where SEQSCHEMA = current user;
3、更改序列
同Oracle,需以DB2语法
4、删除序列
同Oracle
三、Oracle与DB2的差异
除语法差异,以及查询差异外,这里主要讲一个重设开始值的差异
- ORACLE:取得下一个值;先设置步长(下一个值 与 设置的开始值之间差);取得下一个值;再把步长修改成原来值 。
- DB2:ALTER SEQUENCE 序列名 RESTART WITH 下一值。
四、PostgreSQL数据库
1、创建序列的语法:
CREATE [ TEMPORARY | TEMP ] SEQUENCE name [ INCREMENT [ BY ] increment ] [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ] [ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ] [ OWNED BY { table.column | NONE } ]
david=# select nextval('tbl_xulie_id_seq'); nextval --------- 3 (1 row) david=# select nextval('tbl_xulie_id_seq'); nextval --------- 4 (1 row) david=#
3、 查看序列最近使用值
david=# select nextval('tbl_xulie_id_seq'); nextval --------- 4 (1 row) david=# select currval('tbl_xulie_id_seq'); currval --------- 4 (1 row) david=# select currval('tbl_xulie_id_seq'); currval --------- 4 (1 row) david=#