一文全面了解PostgreSQL的序列(sequence)

2022-06-16 17:58:38 浏览数 (1)

一文全面了解PostgreSQL的序列(sequence)

  • 关于序列:Sequence
  • 常用命令
    • 创建序列:2种方法
    • 删除序列
    • 定义表: 3种方法
    • 插入数据
    • 获取序列下一个值
    • 获取当前的序列值
    • 重新设置序列的开始值
  • 错误:duplicate key value violates unique constraint
    • 错误日志
    • 解决方法

关于序列:Sequence

  • 自动增加的数字序列,一般可作为表ID字段的标识,类似MySQL中字段AUTO_INCREMENT属性
  • 官方资料
    • https://www.postgresql.org/docs/9.6/functions-sequence.html

常用命令

创建序列:2种方法

  • 方法一:最简单(全默认)
代码语言:javascript复制
CREATE SEQUENCE oldgeek_test_seq;
  • 方法二:指定序列的开始和最大值
代码语言:javascript复制
CREATE SEQUENCE oldgeek_test_seq
    INCREMENT BY 1
    MAXVALUE 99999999
    START WITH 1
    NO CYCLE;

删除序列

代码语言:javascript复制
drop sequence oldgeek_test_seq;

定义表: 3种方法

方法一:定义表时不指定序列
代码语言:javascript复制
CREATE TABLE oldgeek_test (
    id integer NOT NULL,
    user_name varchar(20),
    PRIMARY KEY(id)
);
方法二:定义表时自动生成序列
  • SERIAL等同于MySQL的AUTO_INCREMENT属性
代码语言:javascript复制
CREATE TABLE oldgeek_test(
  id SERIAL NOT NULL,
  user_name varchar(20),
  PRIMARY KEY(id)
);
方法三:定义表时指定使用序列
代码语言:javascript复制
CREATE SEQUENCE oldgeek_test_seq
    INCREMENT BY 1
    MAXVALUE 99999999
    START WITH 1
    NO CYCLE;
CREATE TABLE oldgeek_test (
    id integer DEFAULT nextval('oldgeek_test_seq') NOT NULL,
    user_name varchar(20),
    PRIMARY KEY(id)
);

插入数据

插入值:对应表定义的:方法一

代码语言:javascript复制
INSERT INTO oldgeek_test VALUES (nextval('oldgeek_test_seq'), 'oldgeek');

插入值:对应表定义的:方法二 Or 方法三

代码语言:javascript复制
INSERT INTO oldgeek_test(user_name) VALUES ('oldgeek');

查看插入后数据

代码语言:javascript复制
SELECT * FROM oldgeek_test;

获取序列下一个值

  • 自定义序列ID(定义表的方法一 Or 方法三)
代码语言:javascript复制
select nextval('oldgeek_test_seq');
  • 使用SERIAL定义序列(定义表的方法二)
    • 序列的命名规则:表名 后缀【_id_seq】
代码语言:javascript复制
select nextval('oldgeek_test_id_seq');

获取当前的序列值

代码语言:javascript复制
select currval('oldgeek_test_seq');

重新设置序列的开始值

代码语言:javascript复制
select setval('oldgeek_test_seq', 1);
select nextval('oldgeek_test_seq');

错误:duplicate key value violates unique constraint

错误日志

代码语言:javascript复制
Unique violation: 7 ERROR: duplicate key value violates unique constraint "oldgeek_test_pkey"↵DETAIL: Key (id)=(33) already exists.

解决方法

确认记录数

代码语言:javascript复制
select MAX(id) FROM oldgeek_test

获取下一个序列数:对比下记录数和序列数

代码语言:javascript复制
select nextval('oldgeek_test_seq');

重新设置序列数:获取最大ID,然后重新设置序列ID

代码语言:javascript复制
select setval('oldgeek_test_seq', (select max(id) from oldgeek_test));

查看下一个序列数

代码语言:javascript复制
select nextval('oldgeek_test_seq');

0 人点赞