【问题标题】:Reset postgres sequence to take un-used primary key ids重置 postgres 序列以获取未使用的主键 ID
【发布时间】:2017-04-02 07:28:38
【问题描述】:

我正在使用 postgres 9.5。作为应用程序初始化的一部分,我在应用程序启动时使用随机 id 在数据库中进行了一些插入。像insert into student values(1,'abc')insert into student values(10,'xyz') 这样的东西。然后我开发了一些其他 API,它们以编程方式插入新行。有什么方法可以告诉 postgres 跳过已经使用的 id?

它试图占用已经使用的 id。我注意到它没有更新初始插入的序列

这是我创建表格的方式

CREATE TABLE student(
    id                  SERIAL PRIMARY KEY,
    name                VARCHAR(64) NOT NULL UNIQUE     
);

【问题讨论】:

  • 添加了表定义。当我尝试使用 API 插入时,是否仍然可以使用 ids 1 然后 10 插入并且仍然跳过 10?在 API 中,我使用 insert into student values(default, 'def') 而不是数字 ID。

标签: postgresql database-sequence


【解决方案1】:

听起来,如果您的数据是分布式的,那么使用 UUID 作为主键值可能会更好。

【讨论】:

    【解决方案2】:

    您可以将填充id 列的序列推进到最大值:

    insert into student (id, name) 
    values 
      (1, 'abc'),
      (2, 'xyz');
    
    select setval(pg_get_serial_sequence('student', 'id'), (select max(id) from student));
    

    【讨论】:

    • 我同意这行得通。但这是问题所在 - 我在我的数据库中拥有的数据是分布式的。我有身份证。 1 , 10 , 20 , 30 , 40 等等。是否可以让 id=2 到 9 然后跳转到 11?
    • @love2code:这是一个全新的问题。是的,如果您手动控制序列并使用 2 而不是 1 的增量,您可以这样做
    • 对不起,如果问题不是很清楚,但这是我最初的问题。如果序列肯定会被 1 个值跳过,++2 将起作用。但如果我有随机 ID。 fr 例如:10,20,21,30,31,32,33,35,40,45 等 ++2 不起作用
    • @love2code:很抱歉你把我弄丢了。我不知道你想做什么。
    • @a_horse_with_no_name 我认为他想避免漏洞。没问题。 叹息
    猜你喜欢
    • 2017-09-06
    • 2010-09-19
    • 2023-01-23
    • 2011-12-31
    • 2020-05-06
    • 1970-01-01
    • 2016-09-24
    相关资源
    最近更新 更多