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
相关产品推荐
相关产品推荐

