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条评论