标题：sequence
Sequence
英音：['si:kwəns]美音：['sikwəns]
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仅仅是指定在表中某一列上，作用范围就是这个表。
四、postgresql中的Sequence分配策略（postgresql8.3.x）
调用select nextval(seq_test);后，系统马上分配一个序号给用户，然后系统的次Sequence马上加上之前设置的步长（increment by 1），不论此序号用户是否使用。
调用select currval(seq_test);返回当前的序列号，该序列号只要没有使用，就不会变化，直到被使用后，才会变化，并且该序列号已经分配给当前请求，不会再分配给其他的请求。
所以，减少浪费时，使用currval，不在乎浪费，而且id不连续的话，可以使用nextval。因为一旦分配给你后，使用失败，将会把该序列号丢弃！
by i_yezi
--------完-------
ORACLE SEQUENCE的简单介绍
在oracle中sequence就是所谓的序列号，每次取的时候它会自动增加，一般用在需要按序列号排序的地方。 
1、Create Sequence 
你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限， 
CREATE SEQUENCE emp_sequence 
INCREMENT BY 1 -- 每次加几个 
START WITH 1 -- 从1开始计数 
NOMAXVALUE -- 不设置最大值 
NOCYCLE -- 一直累加，不循环 
CACHE 10; 
一旦定义了emp_sequence，你就可以用CURRVAL，NEXTVAL 
CURRVAL=返回 sequence的当前值 
NEXTVAL=增加sequence的值，然后返回 sequence 值 
比如： 
emp_sequence.CURRVAL 
emp_sequence.NEXTVAL 
可以使用sequence的地方： 
- 不包含子查询、snapshot、VIEW的 SELECT 语句 
- INSERT语句的子查询中 
- NSERT语句的VALUES中 
- UPDATE 的 SET中 
可以看如下例子： 
INSERT INTO emp VALUES 
(empseq.nextval, 'LEWIS', 'CLERK',7902, SYSDATE, 1200, NULL, 20); 
SELECT empseq.currval FROM DUAL; 
但是要注意的是： 
- 第一次NEXTVAL返回的是初始值；随后的NEXTVAL会自动增加你定义的INCREMENT BY值，然后返回增加后的值。CURRVAL 总是返回当前SEQUENCE的值，但是在第一次NEXTVAL初始化之后才能使用CURRVAL，否则会出错。一次NEXTVAL会增加一次SEQUENCE的值。但是如果你在同一个条SQL语句里面针对同一个sequence使用多次NEXTVAL，其值都是一样的。 
- 如果指定CACHE值，ORACLE就可以预先在内存里面放置一些sequence，这样存取的快些。cache里面的取完后，oracle自动再取一组到cache。 使用cache或许会跳号， 比如数据库突然不正常down掉（shutdown abort),cache中的sequence就会丢失. 所以可以在create sequence的时候用nocache防止这种情况。 
2、Alter Sequence 
你或者是该sequence的owner，或者有ALTER ANY SEQUENCE 权限才能改动sequence. 可以alter除start至以外的所有sequence参数.如果想要改变start值，必须 drop sequence 再 re-create . 
Alter sequence 的例子 
ALTER SEQUENCE emp_sequence 
INCREMENT BY 10 
MAXVALUE 10000 
CYCLE -- 到10000后从头开始 
NOCACHE ; 
影响Sequence的初始化参数： 
SEQUENCE_CACHE_ENTRIES =设置能同时被cache的sequence数目。 
可以很简单的Drop Sequence 
DROP SEQUENCE order_seq;
时序图（Sequence Diagram）
时序图（Sequence Diagram），亦称为序列图或循序图，是一种UML行为图。它通过描述对象之间发送消息的时间顺序显示多个对象之间的动态协作。它可以表示用例的行为顺序，当执行一个用例行为时，时序图中的每条消息对应了一个类操作或状态机中引起转换的触发事件。