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