自动增量,但忽略列中的现有值

2023-12-08

我有一张桌子:

create table DB.t1 (id  SERIAL,name varchar(255));

并插入一些数据:

insert into DB.t1 (name) values ('name1');
insert into DB.t1 (id,name) values (5,'name2');
insert into DB.t1 (name) values ('name3');
insert into DB.t1 (name) values ('name4');
insert into DB.t1 (name) values ('name5');
insert into DB.t1 (name) values ('name6');
insert into DB.t1 (name) values ('name7');
select * from DB.t1;

然后我可以看到:

1 name1
5 name2
2 name3
3 name4
4 name5
5 name6   -- how to make auto-increment jump over '5'?
6 name7

但 5 出现了两次。如何保持id unique?


更新:稍后,更详细的答案:

  • 让 Postgres 选择下一个最小可用 id

这应该可以顺利进行:

CREATE OR REPLACE FUNCTION f_next_free(_seq regclass)
  RETURNS integer
  LANGUAGE plpgsql AS
$func$
BEGIN
   LOOP
      PERFORM nextval(_seq);
      EXIT WHEN NOT EXISTS (SELECT FROM db.t1 WHERE id = lastval());
   END LOOP; 

   RETURN lastval();
END
$func$;

循环从给定序列中获取下一个数字,直到找到表中尚未存在的数字。甚至应该是可安全同时使用,因为我们仍然依赖于序列。

在默认列中使用此函数serial列(替换串行列的默认值nextval('t1_id_seq'::regclass):

ALTER TABLE db.t1 ALTER COLUMN id
SET DEFAULT f_next_free('t1_id_seq'::regclass);

手册上lastval().

这在很少的岛屿和很多间隙的情况下表现良好(根据示例似乎是这种情况)。到enforce唯一性,添加一个唯一约束(或主键)在列上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自动增量,但忽略列中的现有值 的相关文章

随机推荐