首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >一文全面了解PostgreSQL的序列(sequence)

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

作者头像
小码匠
发布2022-06-16 17:58:38
发布2022-06-16 17:58:38
5.4K0
举报

一文全面了解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');
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-05-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小码匠和老码农 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一文全面了解PostgreSQL的序列(sequence)
    • 关于序列:Sequence
    • 常用命令
      • 创建序列:2种方法
      • 删除序列
      • 定义表: 3种方法
      • 插入数据
      • 获取序列下一个值
      • 获取当前的序列值
      • 重新设置序列的开始值
    • 错误:duplicate key value violates unique constraint
      • 错误日志
      • 解决方法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档