PostgreSQL表主键序列达上限,如何重建主键匹配记录数?
解决方法
1. 先备份表(必做,防止操作失误)
CREATE TABLE data_observeddata_backup AS TABLE data_observeddata;
2. 禁止表写入(避免操作期间数据变更)
ALTER TABLE data_observeddata DISABLE TRIGGER ALL;
操作完成后必须重新启用触发器,否则后续写入会异常
3. 重排主键id为连续值(从1开始)
用窗口函数给每条记录分配新的连续id:
UPDATE data_observeddata SET id = new_id FROM ( SELECT id, ROW_NUMBER() OVER (ORDER BY id) AS new_id FROM data_observeddata ) AS sub WHERE data_observeddata.id = sub.id;
这里
ORDER BY id可替换为你需要的排序逻辑(比如创建时间),无特殊需求的话保持原id排序即可
4. 删除原序列并重建
先移除已达上限的旧序列:
DROP SEQUENCE IF EXISTS data_observeddata_id_seq;
创建新序列,起始值设为当前最大id+1(即3741004,对应总记录数3741003):
CREATE SEQUENCE data_observeddata_id_seq START WITH 3741004 INCREMENT BY 1 NO MINVALUE NO MAXVALUE CACHE 1;
5. 关联序列与主键字段
让主键字段默认使用新序列的自增值:
ALTER TABLE data_observeddata ALTER COLUMN id SET DEFAULT nextval('data_observeddata_id_seq'::regclass);
6. 恢复表的写入能力
ALTER TABLE data_observeddata ENABLE TRIGGER ALL;
验证操作结果
- 检查id是否连续:
SELECT COUNT(*) FROM data_observeddata WHERE id BETWEEN 1 AND 3741003;
返回结果应等于总记录数3741003
- 验证序列是否正常生成新值:
SELECT nextval('data_observeddata_id_seq');
应返回3741004,后续调用会正常递增
内容的提问来源于stack exchange,提问作者xpanta
相关产品推荐
相关产品推荐

