PostgreSql 项目实战 8 - pg数据库分区表的坑

53 阅读1分钟

1 问题描述

由于mysql迁移到pg库,然后对之前的表重新做了分区,
从新设置绑定的主键名称,导致主键序列从1开始,
最后导致主键冲突的异常!!

2 解决办法:

2.1 查看所有表序列

-- 生成所有重置SQL语句(先预览,不执行)
SELECT 
    'SELECT setval(''' || 
    pg_get_serial_sequence('public.' || table_name, column_name) || 
    ''', (SELECT COALESCE(MAX(' || column_name || '), 0) FROM public.' || table_name || '), true);' 
    AS reset_sql,
    table_name,
    column_name
FROM information_schema.columns 
WHERE table_schema = 'public'
  AND table_catalog = 'okyun'  -- 你的数据库名
  AND column_default LIKE 'nextval%'
ORDER BY table_name;

2.2 逐个重置序列到当前最大

SELECT setval('public.verifac_invoice_invoice_id_seq', (SELECT COALESCE(MAX(invoice_id), 0) FROM public.verifac_invoice), true);

SELECT setval('public.verifac_invoice_detail_detail_id_seq', (SELECT COALESCE(MAX(detail_id), 0) FROM public.verifac_invoice_detail), true);
......

2.3 可以批量一次全部处理

写个脚本,一次执行,但是不推荐,怕处理不好就跑路了!!!