Postgresql数据库和Oracle数据库一样,都是单独的序列,而不像MySQL其序列是绑定在一张表的字段上。MySQL的序列有以下限制:
(1)自增长只能用于表中的某一个字段。
(2)自增长只能被分配给固定表的某一个固定的字段,不能被多个表共用。
但是Postgresql数据库没有以上限制。
语法如下:
CREATE [ TEMPORARY | TEMP ] SEQUENCE [ IF NOT EXISTS ] name
[ AS data_type ]
[ INCREMENT [ BY ] increment ]
[ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]
[ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE ]
[ OWNED BY { table_name.column_name | NONE } ]
语法解析:
1.TEMPORARY or TEMP
如果指定了此选项,序列对象会只会创建在当前会话中,会话退出时自动删除,临时序列存在的会话,同名称的永久性序列不可见,但是可以指定模式名称来查看。
2.IF NOT EXISTS
如果具有相同名称的关系已经存在,则不要抛出错误。在这种情况下会发出提示。要注意的是,不能保证现有的关系与将要创建的序列有任何相似之处—它甚至可能不是一个序列。
3.name
创建的序列名称。
4.data_type
ata_type的可选子句指定序列的数据类型。有效的类型有smallint、integer和bigint。默认是bigint。数据类型决定了序列的默认最小值和最大值。
5.increment
可选子句INCREMENT BY INCREMENT指定将哪个值添加到当前序列值以创建新值。也就是序列步长。一个正的值将使一个上升的序列,一个负的值将使一个下降的序列。默认值是1。
6.minvalue 或 NO MINVALUE
可选子句MINVALUE minvalue 、NO MINVALUE确定序列可以生成的最小值。如果没有提供这个子句,或者将使用默认值 NO MINVALUE。升序序列的默认值是1。降序序列的默认值是数据类型的最小值。
7.maxvalue 或 NO MAXVALUE
可选子句MAXVALUE maxvalue、NO MAXVALUE 确定序列的最大值。如果没有提供这个子句,或者将使用默认值 NO MAXVALUE。升序序列的默认值是数据类型的最大值。降序序列的默认值是-1。
8.START [WITH] start
指定序列开始的起点值
9.CACHE cache
指定cache的数值,缓存几个系列值,默认是1,表示一次性生成1个值,也就是不缓存。
10.CYCLE 或 NO CYCLE
在序列达到最大值maxvalue或最小值minvalue时,是否循环从新开始。默认是NO CYCLE。
11.OWNED BY table_name.column_name 或 OWNED BY NONE
OWNED BY 选项用于将序列关联到一个特定的表字段上,当删除字段或所在的表时序列也会自动删除。指定的表和序列必须在同一个模式下被同一个用户拥有。默认是无关联OWNED BY NONE。
Postgresql通过一些全局函数来使用序列:
类型名称 | 返回类型 | 描述 |
---|---|---|
currval(regclass) | bigint | 返回最近一次用nextval获取的指定序列的数值 |
lastval() | bigint | 返回最近一次用nextval获取的任何序列的数值 |
nextval(regclass) | bigint | 递增序列并返回新值 |
setval(regclass, bigint) | bigint | 设置序列的当前数值 |
setval(regclass, bigint, boolean) | bigint | 设置序列的当前数值及is_called标志 |
postgres=# create sequence seqtest01;
CREATE SEQUENCE
postgres=# select nextval('seqtest01');
nextval
---------
1
(1 row)
postgres=# select nextval('seqtest01');
nextval
---------
2
(1 row)
nextval函数的参数是regclass,而输入的是一个字符串,这因为regclass类型会自动把字符串转成regclass类型。
使用currval函数可以返回最近一次使用nextval获取的指定序列的数值:
postgres=# select nextval('seqtest01');
nextval
---------
2
(1 row)
postgres=# select currval('seqtest01');
currval
---------
2
(1 row)
postgres=# select nextval('seqtest01');
nextval
---------
3
(1 row)
postgres=# select currval('seqtest01');
currval
---------
3
(1 row)
注意如果在新会话中直接调用currval会报错,必须是在执行过一次nextval函数的会话中调用才行。
lastval函数与currval函数不同,不管最后调用的是哪个序列,总返回最后一次调用的nextval函数的值,不限制序列,只返回最后一次调用的。
setval函数能够改变序列的当前值,若之后在调用nextval,返回的值将变成改变后的当前值+1:
postgres=# select nextval('seqtest01');
nextval
---------
5
(1 row)
postgres=# select setval('seqtest01', 2);
setval
--------
2
(1 row)
postgres=# select nextval('seqtest01');
nextval
---------
3
(1 row)
三个参数的setval使用时,如果设置了is_called为true,表示下一次的nextval将在返回数值之前递增该序列。如果设置了is_called为false,那么下一次nextval将返回声明的数值,只有再次调用nextval才开始递增该序列。如:
postgres=# select setval('seqtest01', 2, true);
setval
--------
2
(1 row)
postgres=# select nextval('seqtest01');
nextval
---------
3
(1 row)
postgres=# select nextval('seqtest01');
nextval
---------
4
(1 row)
postgres=# select setval('seqtest01', 2, false);
setval
--------
2
(1 row)
postgres=# select nextval('seqtest01');
nextval
---------
2
(1 row)
postgres=# select nextval('seqtest01');
nextval
---------
3
(1 row)
1.在BEGIN事务中使用序列后,回滚事务,序列不会回滚。
2.序列的范围是bigint范围,在不支持8字节整数的编译器会是普通的integer范围。
3.使用cache缓存大于1的序列到多会话并发环境,因为每次缓存后的数值会在会话后丢失,造成序列出现空洞现象。