PostgreSql数据库迁移后自增ID引起的序列问题解决

1、背景

系统在本地测试的时候好好的,结果PG数据库迁移到服务器后进行添加操作的时候会报一个错误:more than one owned sequence found。
结果一查网上有很多说是自增ID迁移数据库后留下的一个坑,是序列产生的问题,找到了一个解决方法,测试有效,记录如下:

2、解决方案

执行sql语句

do --check seq not in sync
$$
declare
 _r record;
 _i bigint;
 _m bigint;
begin
  for _r in (
    Select
      DISTINCT(constraint_column_usage.table_name) as tablename,
      constraint_column_usage.column_name as idname,
      replace(replace(columns.column_default,'''::regclass)',''),'nextval(''','') as seqname,
            columns.table_schema as schamename
      from information_schema.constraint_column_usage, information_schema.columns
      where constraint_column_usage.table_schema ='public' AND
      columns.table_schema = 'public' AND columns.table_name=constraint_column_usage.table_name
      AND constraint_column_usage.column_name = columns.column_name
      AND columns.column_default is not null
   ) loop
    execute format('select last_value from %I.%s',_r.schamename,_r.seqname) into _i;
    execute format('select max(%I) from %I.%I',_r.idname,_r.schamename,_r.tablename) into _m;
    if coalesce(_m,0) > _i then
      raise info '%',concat('changed: ',_r.tablename||'_Id_seq',' from:',_i,' to:',_m+1);
      execute format('alter sequence %I.%s restart with %s',_r.schamename,_r.seqname,_m+1);
    end if;
  end loop;

end;
$$
;

注意不是public的记得要改一下~
参考:https://www.cnblogs.com/Raspberry-zx/p/12702310.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值