SERIAL 字段从 1 开始并且不跳到下一个可用位置

问题描述 投票:0回答:1

我正在使用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
,因为我需要用表之间的关系来播种它。也许这就是尝试使用序列号添加新记录时产生问题的原因?

postgresql supabase supabase-database
1个回答
0
投票

有两种选择:

  1. 开始插入行之前,将您在

    DEFAULT
    列的
    id
    子句中看到的序列设置为高于您已播种的所有行的
    id
    的值:

    SELECT setval('tablea_id_seq', 100000);
    

    (我的建议是使用

    bigint
    标识列而不是
    serial
    ,但过程保持不变:您已正确设置序列值。)

    (如果您不想要我的第一个建议,我的第二个建议是使用

    bigserial
    而不是
    serial
    。)

  2. 使用

    uuid
    作为主键列,那么就不用担心冲突了。

© www.soinside.com 2019 - 2024. All rights reserved.