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

PostgreSQL+drizzle-orm插入时报唯一约束冲突问题求助

问题描述

我正在使用drizzle-orm操作PostgreSQL数据库,现有如下数据表:

export const ExperimentData = pgTable('experiment_data', {
  id: bigserial('id', { mode: 'number' }).primaryKey(),
  timestamp: bigint('timestamp', { mode: 'number' }),
  websiteId: bigint('website_id', { mode: 'number' }),
  experimentId: bigint('experiment_id', { mode: 'number' }),
  variantId: bigint('variant_id', { mode: 'number' }),
  event: varchar('event', { mode: 'string', length: 255 }),
  data: json('data'),
});

编写了脚本从Redis读取数据并插入该表:

await statisticsdb.insert(ExperimentData).values({ timestamp, websiteId, experimentId, variantId, event, data });

该脚本由定时任务每小时触发执行,首次插入就报错:

PostgresError: duplicate key value violates unique constraint "experiment_data_pkey"
 code: "23505"

      at ErrorResponse (/home/ubuntu/production/pertento/node_modules/postgres/src/connection.js:792:23)
      at handle (/home/ubuntu/production/pertento/node_modules/postgres/src/connection.js:811:5)
      at data (/home/ubuntu/production/pertento/node_modules/postgres/src/connection.js:562:3)
      at emit (native:1:1)
      at addChunk (native:1:1)
      at readableAddChunk (native:1:1)
      at data (native:1:1)

相关情况:

  • 未修改过数据库表结构或数据
  • 表中仅id字段为主键,且未手动指定id值

查询序列后发现:
执行select * from public.experiment_data_id_seq;得到值为253020,但表中最新ID为1171578,二者差距极大。请问该如何修复?能否直接修改数据库中的序列值?

解决方案

可以直接修改序列值,这是解决该问题的标准做法

执行以下SQL命令,将序列的当前值重置为表中最大ID+1,确保后续自动生成的ID不会重复:

-- 先查询表中最大的id值
SELECT MAX(id) FROM experiment_data;

-- 将序列设置为最大id+1,替换[max_id]为实际查询到的最大值
ALTER SEQUENCE public.experiment_data_id_seq RESTART WITH [max_id] + 1;

例如查询到最大ID是1171578时,执行:

ALTER SEQUENCE public.experiment_data_id_seq RESTART WITH 1171579;

问题原因分析

出现这种情况通常是因为曾经手动插入过指定id值的数据,此时PostgreSQL的自增序列不会自动同步更新,导致序列当前值远小于表中已有的最大ID,后续自动生成ID时就会触发主键重复冲突。

内容的提问来源于stack exchange,提问作者Pastilhas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 08:05:00