PostgreSQL 序列sequence使用示例

PostgreSQL 支持序列,可以在创建表的时候指定字段类型为序列,也可以先创建一个序列,然后将其与表的字段进行关联。

1. 创建包含序列类型的表

序列的类型名为 serial 或者 bigserial,如下所示:

postgres=# create table t(id serial, name text);
CREATE TABLE
postgres=# insert into t(name) values('abc');
INSERT 0 1
postgres=# insert into t(name) values('def');
INSERT 0 1
postgres=# select * from t;
 id | name
----+------
  1 | abc
  2 | def
(2 rows)

2. 创建序列对象并与表字段关联

创建序列对象:

-- 使用默认参数创建序列
create sequence mysequence;

-- 也可以指定序列参数
create sequence myseq
    increment by 1
    minvalue 1
    maxvalue 999
    start 1
    cache 1 
    cycle;

创建表对象,并让其字段 id 的默认值为序列的下一个值:

create table t(id int default nextval('mysequence'), name text);

插入数据,查看序列值变化,如下:

postgres=# insert into t(name) values('a');
INSERT 0 1
postgres=# insert into t(name) values('b');
INSERT 0 1
postgres=# select * from t;
 id | name
----+------
  1 | a
  2 | b
(2 rows)

3. 序列相关的函数

  • nextval(sequence_name),递增序列,并返回新值
  • lastval(),返回最近一次使用 nextval() 获取的任一序列值
  • currval(sequence_name),返回最近一次使用 nextval() 获取的指定序列的数值
  • setval(sequence_name, value),设置序列的当前数值
  • setval(sequence_name, value,is_called),设置当前序列的值及 is_called 标记

4. 序列的 alter 操作

可以动态对序列进行修改,比如修改序列的当前值,最大值,序列的拥有者等。以序列属主为例,一个序列可以与多个表关联,但是只能有一个表拥有(owned)序列,可以通过 alter sequence 语句修改序列的拥有者,如下:

alter sequence t3_c4_seq owned by t4.c4;

序列的更多 alter 操作,可参考 psql 命令帮助,\h alter sequence 即可显示该命令详细的帮助信息。

postgres=# \h alter sequence
Command:     ALTER SEQUENCE
Description: change the definition of a sequence generator
Syntax:
ALTER SEQUENCE [ IF EXISTS ] name
    [ AS data_type ]
    [ INCREMENT [ BY ] increment ]
    [ MINVALUE minvalue | NO MINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE ]
    [ START [ WITH ] start ]
    [ RESTART [ [ WITH ] restart ] ]
    [ CACHE cache ] [ [ NO ] CYCLE ]
    [ OWNED BY { table_name.column_name | NONE } ]
ALTER SEQUENCE [ IF EXISTS ] name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }
ALTER SEQUENCE [ IF EXISTS ] name RENAME TO new_name
ALTER SEQUENCE [ IF EXISTS ] name SET SCHEMA new_schema

URL: https://www.postgresql.org/docs/13/sql-altersequence.html

5. 删除序列

使用 drop sequence 语法删除序列,如下:

drop sequence myseq;

文章评论

0条评论