我有一张桌子:
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?
更新:稍后,更详细的答案:
这应该可以顺利进行:
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(使用前将#替换为@)