PostgreSQL 设置主键的序列值

1. 问题的提出

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

 

2. 解决的方法

首先使用MAX函数查询目前表中最大的主键值,然后使用setval函数把最大主键值设置为当前的序列值。

假设表名为ApplicationRunInfo, 主键字段名为ID,则序列名为ApplicationRunInfo_ID_seq。

获取当前最大主键值:

SELECT MAX("ID") FROM "ApplicationRunInfo";     输出500

获取下一个序列值:

SELECT nextval('"ApplicationRunInfo_ID_seq"');   输出100

设置当前最大主键值为序列值:

SELECT setval('"ApplicationRunInfo_ID_seq"', (SELECT MAX("ID") FROM "ApplicationRunInfo"));    输出500,更新成功

获取下一个序列值:

SELECT nextval('"ApplicationRunInfo_ID_seq"');   输出501,问题解决

 

3.注意的事项

使用序列名时要注意,如果序列名中包含大写,必须写成'"序列名"',外层单引号,内存双引号;只使用单引号,则全部转换成小写。

   nextval('"ApplicationRunInfo_ID_seq"')    序列名为ApplicationRunInfo_ID_seq

   nextval('ApplicationRunInfo_ID_seq')     序列名为applicationruninfo_id_seq

序列名是表名_主键名_seq,可以在数据库的序列目录下查看,如下图所示:

 

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.cnblogs.com/GordonYang/p/7095480.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值