PostgreSQL 设置主键的序列值教程

2019-03-3017:49:33数据库教程Comments4,532 views字数 1004阅读模式

1. 问题的提出文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10831.html

PostgreSQL定义TABLE时,主键的字段类型可以设定为自增类型serial,即插入每条记录时,主键的值自动加1。但是,当插入数据的时候指定了具体的主键值,例如主键值从0到500,这时主键的序列值不会跟着更新到500。那么以后再自动生成主键序列值时,会出现因为主键序列值重复而无法插入新的记录的问题。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10831.html

2. 解决的方法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10831.html

首先使用MAX函数查询目前表中最大的主键值,然后使用setval函数把最大主键值设置为当前的序列值。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10831.html

假设表名为ApplicationRunInfo, 主键字段名为ID,则序列名为ApplicationRunInfo_ID_seq。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10831.html

获取当前最大主键值:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10831.html

SELECT MAX("ID") FROM "ApplicationRunInfo";     输出500文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10831.html

获取下一个序列值:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10831.html

SELECT nextval('"ApplicationRunInfo_ID_seq"');   输出100文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10831.html

设置当前最大主键值为序列值:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10831.html

SELECT setval('"ApplicationRunInfo_ID_seq"', (SELECT MAX("ID") FROM "ApplicationRunInfo"));    输出500,更新成功文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10831.html

获取下一个序列值:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10831.html

SELECT nextval('"ApplicationRunInfo_ID_seq"');   输出501,问题解决文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10831.html

3.注意的事项文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10831.html

使用序列名时要注意,如果序列名中包含大写,必须写成'"序列名"',外层单引号,内存双引号;只使用单引号,则全部转换成小写。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10831.html

nextval('"ApplicationRunInfo_ID_seq"')    序列名为ApplicationRunInfo_ID_seq文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10831.html

nextval('ApplicationRunInfo_ID_seq')     序列名为applicationruninfo_id_seq文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10831.html

序列名是表名_主键名_seq,可以在数据库的序列目录下查看,如下图所示:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10831.html

PostgreSQL 设置主键的序列值教程文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10831.html

SELECT setval('"ApplicationRunInfo_ID_seq"', 42); 下次nextval将返回43
SELECT setval('"ApplicationRunInfo_ID_seq"', 42, true); 和上面一样返回43
SELECT setval('"ApplicationRunInfo_ID_seq"', 42, false); 下次nextval将返回42文章源自菜鸟学院-https://www.cainiaoxueyuan.com/sjk/10831.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/sjk/10831.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定