Supabase PostgreSQL中Serial主键自增起始值异常求助
手动指定ID后PostgreSQL自增序列不同步的问题解决
问题原因
你猜的没错,就是手动指定ID导致的。PostgreSQL里的serial类型本质是整数主键+自动序列生成器的组合:每次插入不指定ID时,会调用序列的nextval()生成下一个值。但你手动插入ID的时候,序列的当前值不会自动跟着更新——比如你手动插了1到10的记录,序列的当前值还是初始的1,所以新插入时会从1开始尝试,直到碰到已存在的ID报错,直到到11才成功插入,看起来就像是“超过10条后才从11开始正常”。
解决办法
1. 找到对应表的序列名
每个serial类型的主键都会对应一个序列,命名规则一般是表名_字段名_seq,比如你的tableA的id字段对应的序列就是tableA_id_seq。不确定的话可以用下面的SQL查询所有序列:
SELECT relname FROM pg_class WHERE relkind = 'S';
2. 更新序列到当前最大ID的下一个值
用setval()函数把序列的当前值设为表中最大ID的下一个数,这样下一次自增就会从正确的数值开始。比如针对tableA:
-- 把序列值设为当前最大ID+1 SELECT setval('tableA_id_seq', (SELECT MAX(id) + 1 FROM tableA));
如果表中还没有记录,直接设为1就行:
SELECT setval('tableA_id_seq', 1);
3. 后续操作注意事项
如果之后还要手动插入ID,要么插入后手动更新序列,要么插入时用nextval('序列名')来生成ID,比如:
INSERT INTO tableA (id, field, created_at, table_b_fkey) VALUES (nextval('tableA_id_seq'), 'new content', now(), 1);
这样就能保证序列和实际ID同步,不会再出现自增从1开始的问题。
内容的提问来源于stack exchange,提问作者kevin
相关产品推荐
相关产品推荐

