我正在使用supabase postgresql。我已经在数据库中植入了各个表中的记录,现在正在尝试创建一个管理门户来在我的表中创建新记录。
对于我的相关表,我想在其上自动创建记录,而无需在插入期间提供 ID ;为此,我将我的 pkey 设置为
serial
。不幸的是,当我尝试创建新记录时,它一直从 1 开始,然后是 2,然后是 3,因为我反复尝试提交我的新记录。最终,它超出了我的(10)种子记录,然后成功添加了新的第 11 条记录,依此类推。我不明白它为什么要这样做,我本以为它会看到表中已经有 10 条记录,并且只是从 11 条开始。对此有更多了解的人可以为我提供一些见解吗?
这是我正在使用的 supabase 插入,与 supabase 文档中提供的模板几乎相同:
const { data, error } = await supabase
.from('my_table')
.insert([
{someField: 'abc'}
])
.select()
我认为我可以提供的唯一其他背景是我的播种操作中的一些片段。我像这样插入表格:
INSERT INTO tableA (id, field, created_at, table_b_fkey)
VALUES
(1, 'hello world', '2024-03-16 14:00:00', 1),
...
INSERT INTO tableB (id, field, created_at)
VALUES
(1, 'hola mundo', '2024-03-16 14:00:00'),
...
在这些情况下,我实际上确实在我的表中提供了一个显式的
primary_key
作为 id
,因为我需要用表之间的关系来播种它。也许这就是尝试使用序列号添加新记录时产生问题的原因?
有两种选择:
开始插入行之前,将您在
DEFAULT
列的 id
子句中看到的序列设置为高于您已播种的所有行的 id
的值:
SELECT setval('tablea_id_seq', 100000);
(我的建议是使用
bigint
标识列而不是 serial
,但过程保持不变:您已正确设置序列值。)
(如果您不想要我的第一个建议,我的第二个建议是使用
bigserial
而不是 serial
。)
使用
uuid
作为主键列,那么就不用担心冲突了。