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

           PostgreSQL自增序列-主键冲突问题_第1张图片

  1. PostgreSQL自增序列-主键冲突问题_第2张图片

你可能感兴趣的:(数据库)