You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 19:43:22