Postgresql学习笔记之——序列的使用

Postgresql数据库和Oracle数据库一样,都是单独的序列,而不像MySQL其序列是绑定在一张表的字段上。MySQL的序列有以下限制:
(1)自增长只能用于表中的某一个字段。
(2)自增长只能被分配给固定表的某一个固定的字段,不能被多个表共用。

但是Postgresql数据库没有以上限制。

1.序列的创建

语法如下:

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。

2、序列的使用和相关函数

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)

4.注意

1.在BEGIN事务中使用序列后,回滚事务,序列不会回滚。

2.序列的范围是bigint范围,在不支持8字节整数的编译器会是普通的integer范围。

3.使用cache缓存大于1的序列到多会话并发环境,因为每次缓存后的数值会在会话后丢失,造成序列出现空洞现象。

以待更新。。。

你可能感兴趣的:(Postgresql)