0
点赞
收藏
分享

微信扫一扫

PostgreSQL-sequence 序列

1 创建并查看序列

[postgres@pgccc01 ~]$ psql
psql (14.7)
Type "help" for help.

postgres=# create sequence seq_baoyw start 100;
CREATE SEQUENCE
postgres=# select currval('seq_baoyw');
2023-05-15 15:06:04.751 CST [7492] ERROR:  currval of sequence "seq_baoyw" is not yet defined in this session
2023-05-15 15:06:04.751 CST [7492] STATEMENT:  select currval('seq_baoyw');
# ERROR:序列 seq_baoyw 当前值并未在本次会话中定义。
ERROR:  currval of sequence "seq_baoyw" is not yet defined in this session
postgres=# select nextval('seq_baoyw');
 nextval
---------
     100
(1 row)

postgres=# select nextval('seq_baoyw');
 nextval
---------
     101
(1 row)

postgres=# select setval('seq_baoyw',88);
 setval
--------
     88
(1 row)

postgres=# select nextval('seq_baoyw');
 nextval
---------
      89
(1 row)

postgres=#

2 查看帮助

2.1 创建序列

postgres=# \h create sequence
Command:     CREATE SEQUENCE
Description: define a new sequence generator
Syntax:
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 } ]

URL: https://www.postgresql.org/docs/14/sql-createsequence.html

postgres=#

2.2 更改序列

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_ROLE | 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/14/sql-altersequence.html

postgres=#

3 更改序列相关操作

postgres=# select currval('seq_baoyw');
 currval
---------
      89
(1 row)

## 重置序列步长为2
postgres=# alter sequence seq_baoyw increment by 2;
ALTER SEQUENCE
postgres=# select nextval('seq_baoyw');
 nextval
---------
      91
(1 row)

postgres=# select nextval('seq_baoyw');
 nextval
---------
      93
(1 row)

postgres=# select nextval('seq_baoyw');
 nextval
---------
      95
(1 row)

## 重置序列从5开始
postgres=# alter sequence seq_baoyw restart with 5;
ALTER SEQUENCE
postgres=# select nextval('seq_baoyw');
 nextval
---------
       5
(1 row)

postgres=# select nextval('seq_baoyw');
 nextval
---------
       7
(1 row)

postgres=# select nextval('seq_baoyw');
 nextval
---------
       9
(1 row)

##更改序列最大值为200
postgres=# alter sequence seq_baoyw maxvalue 200;
ALTER SEQUENCE
postgres=# select nextval('seq_baoyw');
 nextval
---------
      11
(1 row)

postgres=# select nextval('seq_baoyw');
 nextval
---------
      13
(1 row)

## 更改序列步长为50
postgres=# alter sequence seq_baoyw increment by 50;
ALTER SEQUENCE
postgres=# select nextval('seq_baoyw');
 nextval
---------
      63
(1 row)

postgres=# select nextval('seq_baoyw');
 nextval
---------
     113
(1 row)

postgres=# select nextval('seq_baoyw');
 nextval
---------
     163
(1 row)

postgres=# select nextval('seq_baoyw');
2023-05-15 15:22:32.929 CST [7492] ERROR:  nextval: reached maximum value of sequence "seq_baoyw" (200)
2023-05-15 15:22:32.929 CST [7492] STATEMENT:  select nextval('seq_baoyw');
ERROR:  nextval: reached maximum value of sequence "seq_baoyw" (200)
postgres=#
## 开启序列循环
postgres=# alter sequence seq_baoyw cycle;
ALTER SEQUENCE
postgres=# select nextval('seq_baoyw');
 nextval
---------
       1
(1 row)

postgres=# select nextval('seq_baoyw');
 nextval
---------
      51
(1 row)

postgres=# select nextval('seq_baoyw');
 nextval
---------
     101
(1 row)

postgres=# select nextval('seq_baoyw');
 nextval
---------
     151
(1 row)

postgres=# select nextval('seq_baoyw');
 nextval
---------
       1
(1 row)

postgres=# select nextval('seq_baoyw');
 nextval
---------
      51
(1 row)

## 关闭序列循环
postgres=# alter sequence seq_baoyw no cycle;
ALTER SEQUENCE
postgres=# select nextval('seq_baoyw');
 nextval
---------
     101
(1 row)

postgres=# select nextval('seq_baoyw');
 nextval
---------
     151
(1 row)

postgres=# select nextval('seq_baoyw');
2023-05-15 15:26:56.204 CST [7492] ERROR:  nextval: reached maximum value of sequence "seq_baoyw" (200)
2023-05-15 15:26:56.204 CST [7492] STATEMENT:  select nextval('seq_baoyw');
ERROR:  nextval: reached maximum value of sequence "seq_baoyw" (200)
postgres=#

#更改序列步长
alter sequence seq_baoyw increment by 2;
#重置序列从5开始
alter sequence seq_baoyw restart with 5;
#更改序列最大值为200
alter sequence seq_baoyw maxvalue 200;
#开启序列循环
alter sequence seq_baoyw cycle;
#关闭序列循环
alter sequence seq_baoyw no cyvle;

4 删除序列

postgres=# drop sequence seq_baoyw;
DROP SEQUENCE
postgres=#

5 使用序列的一个粟子

postgres=# create table t_serial (id serial primary key,name varchar(20));
CREATE TABLE
postgres=# insert into t_serial (name) values ('赵'),('钱'),('孙'),('李'),('周'),('吴'),('郑'),('王');
INSERT 0 8
## 生成一个从1到10,步进为1的数值序列
postgres=# select generate_series(1,10);
 generate_series
-----------------
               1
               2
               3
               4
               5
               6
               7
               8
               9
              10
(10 rows)

postgres=# select * from t_serial;
 id | name
----+------
  1 | 赵
  2 | 钱
  3 | 孙
  4 | 李
  5 | 周
  6 | 吴
  7 | 郑
  8 | 王
(8 rows)

postgres=# select name from (select generate_series(1,10),substring('赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜',(random()*5)::int,(random()*20)::int) as name) a;
                 name
--------------------------------------
 李
 李周吴郑王冯陈褚卫蒋沈韩杨朱秦
 孙李周吴郑王冯陈褚卫蒋沈韩杨
 李周吴郑
 李周吴郑王冯陈褚卫蒋沈韩杨朱秦尤许何
 孙李周吴郑王冯陈褚卫蒋沈韩杨
 钱孙李周吴郑王冯陈褚卫
 赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨
 钱孙李周吴郑王冯陈褚卫蒋沈韩杨
 孙李周吴郑
(10 rows)

postgres=# insert into t_serial(name) select name from (select generate_series(1,10),substring('赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜',(random()*5)::int,(random()*20)::int) as name) a;
INSERT 0 10
postgres=# select * from t_serial;
 id |                  name
----+----------------------------------------
  1 | 赵
  2 | 钱
  3 | 孙
  4 | 李
  5 | 周
  6 | 吴
  7 | 郑
  8 | 王
  9 | 李周吴郑王冯陈褚卫蒋沈韩杨朱秦尤许何吕
 10 | 周吴郑王冯陈褚卫蒋沈
 11 | 赵钱孙李周吴郑
 12 | 赵钱
 13 | 赵
 14 | 赵钱孙李周吴郑王冯陈褚卫
 15 | 赵钱孙李周吴郑王冯陈褚
 16 | 孙李周吴郑王冯陈褚卫蒋沈韩杨
 17 | 李周吴郑王冯陈褚卫蒋沈
 18 | 赵钱孙李
(18 rows)

postgres=#
postgres=# create sequence seq_baoyw start 100;
CREATE SEQUENCE
postgres=#
postgres=# \ds
               List of relations
 Schema |      Name       |   Type   |  Owner
--------+-----------------+----------+----------
 public | seq_baoyw       | sequence | postgres
 public | t_serial_id_seq | sequence | postgres
(2 rows)

postgres=# \ds+
                                    List of relations
 Schema |      Name       |   Type   |  Owner   | Persistence |    Size    | Description
--------+-----------------+----------+----------+-------------+------------+-------------
 public | seq_baoyw       | sequence | postgres | permanent   | 8192 bytes |
 public | t_serial_id_seq | sequence | postgres | permanent   | 8192 bytes |
(2 rows)

postgres=#

举报

相关推荐

0 条评论