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

使用Supabase+Prisma时,如何在种子数据时重置PostgreSQL自增ID?

解决Prisma+Supabase中自增主键ID重置问题

问题原因

你遇到的relation "user_id_seq" does not exist错误,是因为PostgreSQL中序列的实际名称可能和你硬编码的不一致——Prisma或Supabase的默认命名规则可能会给序列加上schema前缀(比如public.user_id_seq),或者序列名的生成逻辑和你预期不同。

无需删除表重跑迁移的解决方案

方案1:动态获取序列名并重置

用PostgreSQL内置函数pg_get_serial_sequence自动获取对应表主键的序列名,避免硬编码出错:

// 先删除所有数据
await prisma.user.deleteMany();
await prisma.post.deleteMany();

// 获取user表id字段对应的序列名
const userSeqResult = await prisma.$queryRaw`SELECT pg_get_serial_sequence('public.user', 'id') AS seq`;
const userSeq = userSeqResult[0].seq;
await prisma.$queryRaw`ALTER SEQUENCE ${userSeq} RESTART WITH 1`;

// 获取post表id字段对应的序列名
const postSeqResult = await prisma.$queryRaw`SELECT pg_get_serial_sequence('public.post', 'id') AS seq`;
const postSeq = postSeqResult[0].seq;
await prisma.$queryRaw`ALTER SEQUENCE ${postSeq} RESTART WITH 1`;

注意:如果你的表不在public schema下,需要替换成对应的schema名称。

方案2:插入测试数据时指定ID(更推荐)

不需要依赖序列重置,直接在创建测试数据时手动指定ID值,这样不管序列当前值是多少,测试数据的ID都会是你预期的固定值:

await prisma.user.deleteMany();
await prisma.post.deleteMany();

// 创建测试用户时指定ID
await prisma.user.create({
  data: {
    id: 1,
    name: "测试用户1",
    email: "test1@example.com"
    // 其他字段...
  }
});

// 创建测试帖子时指定ID
await prisma.post.create({
  data: {
    id: 1,
    title: "测试帖子1",
    content: "测试内容",
    authorId: 1
    // 其他字段...
  }
});

这种方法更稳定,避免了和数据库序列状态绑定的问题。

方案3:确认序列的实际名称

如果你想继续用硬编码的方式,可以先在Supabase的SQL编辑器里执行以下查询,找到正确的序列名:

SELECT sequence_name, sequence_schema 
FROM information_schema.sequences 
WHERE sequence_schema = 'public';

找到对应表的序列后,把ALTER SEQUENCE语句里的序列名替换成查询结果中的值,比如如果结果是public.user_id_seq,就执行:

await prisma.$queryRaw`ALTER SEQUENCE public.user_id_seq RESTART WITH 1`;

总结

完全不需要删除表并重新运行迁移,上面的任意一种方案都可以解决自增ID不重置的问题,其中**方案2(手动指定ID)**是最推荐的,因为它不依赖数据库的序列状态,更适合测试数据的填充场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 02:25:41