Postgresql 重置postgres序列以获取未使用的主键ID

Postgresql 重置postgres序列以获取未使用的主键ID,postgresql,database-sequence,Postgresql,Database Sequence,我使用的是postgres 9.5。作为应用程序初始化的一部分,我在应用程序启动时使用随机ID在数据库中进行一些插入。类似于插入学生值(1,'abc'),插入学生值(10,'xyz')。然后我开发了一些RESTAPI,它们通过编程插入新行。我们有没有办法告诉postgres跳过已经获取的ID 它试图使用已经使用过的ID。我注意到它没有更新初始插入的顺序 下面是我如何创建表的 CREATE TABLE student( id SERIAL PRIMARY

我使用的是postgres 9.5。作为应用程序初始化的一部分,我在应用程序启动时使用随机ID在数据库中进行一些插入。类似于
插入学生值(1,'abc')
插入学生值(10,'xyz')
。然后我开发了一些RESTAPI,它们通过编程插入新行。我们有没有办法告诉postgres跳过已经获取的ID

它试图使用已经使用过的ID。我注意到它没有更新初始插入的顺序

下面是我如何创建表的

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

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

insert into student (id, name) 
values 
  (1, 'abc'),
  (2, 'xyz');

select setval(pg_get_serial_sequence('student', 'id'), (select max(id) from student));

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

insert into student (id, name) 
values 
  (1, 'abc'),
  (2, 'xyz');

select setval(pg_get_serial_sequence('student', 'id'), (select max(id) from student));

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

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

添加了表定义。当我尝试使用API进行插入时,是否仍然可以使用IDs1和10进行插入,并跳过10?在API中,我使用
插入学生值(默认值为'def')
而不是数字ID。添加了表定义。当我尝试使用API进行插入时,是否仍然可以使用IDs1和10进行插入,并跳过10?在API中,我使用
插入学生值(默认值为'def')
,而不是数字ID。我同意这是可行的。但问题是,我数据库中的数据是分布式的。我有身份证。1、10、20、30、40等等。有没有可能让id=2到9,然后跳到11?@love2code:这是一个全新的问题。是的,如果您手动控制序列并使用增量2而不是1,您可以这样做。如果问题不是很清楚,但这是我的原始问题,请担心++如果序列被1值跳过,则2将起作用。但如果我有随机ID。fr-eg:10,20,21,30,31,32,33,35,40,45等等++2不会work@love2code对不起,你把我弄丢了。“我不知道你想干什么。”一匹没有名字的马,我想他想避开洞。没有问题。我同意这是可行的。但问题是,我数据库中的数据是分布式的。我有身份证。1、10、20、30、40等等。有没有可能让id=2到9,然后跳到11?@love2code:这是一个全新的问题。是的,如果您手动控制序列并使用增量2而不是1,您可以这样做。如果问题不是很清楚,但这是我的原始问题,请担心++如果序列被1值跳过,则2将起作用。但如果我有随机ID。fr-eg:10,20,21,30,31,32,33,35,40,45等等++2不会work@love2code对不起,你把我弄丢了。“我不知道你想干什么。”一匹没有名字的马,我想他想避开洞。没有问题。叹息