PostgreSQL自增序列-主键冲突问题

  • 答案:
  • SELECT setval('自增序列名',MAX(自增主键)+1,true) FROM 表名;

     

  • 查询全部序列:

select * from pg_class where relowner=(select usesysid from pg_user where usename='postgres') and relkind='S'

  • 创建序列
CREATE SEQUENCE t_app_app_id_seq
  INCREMENT 1
  MINVALUE 1
  MAXVALUE 99999999999
  START 1
  CACHE 10;
ALTER TABLE t_app_app_id_seq
  OWNER TO postgres;
  • 问题描述:
  1. 当前t_app表最大id为99
  2. SELECT nextval('t_app_app_id_seq'::regclass)为100
  3. 手动插入一条id为100的数据。(如果在MySQL中,此时表t_app的序列已自动调整为100,下一个序列值为101。)
  4. PostgreSQL中 SELECT nextval('t_app_app_id_seq'::regclass)仍为100

问题定位:

     自增序列没有判断下一个序列值是否小于表内最大ID。

解决思路:

  1. 设置当前序列值为表中最大值
  2. SQL:
    SELECT setval('t_app_app_id_seq',MAX(自增主键),true) FROM 表名;
    true:下一个序列值为设置值+1,false:下一个序列值为当前设置值。
  • 即手动设置当前序列值(参考解决思路1、2步)

            或在Insert或Update触发器中实现上一步的判断。(触发器请百度实现,不建议使用触发器。手动调整序列值即可,一般情况也没人去篡改数据导致自增序列异常)

           

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值