我最近遇到了PSQL(v11(的一个非常奇怪的行为:
如果我创建一个带有标识列的表,添加一些记录,然后删除最后一行,则此行键将被重用!
create table "MyTable" (id identity not null, name varchar(50));
insert into "MyTable" (name) values ('Row 1');
insert into "MyTable" (name) values ('Row 2');
insert into "MyTable" (name) values ('Row 3');
select * from "MyTable"
目前为止,一切都好
id name
=========== ============
1 Row 1
2 Row 2
3 Row 3
那么当我删除"第 3 行"时
delete from "MyTable" where id = 3;
并添加新行
insert into "MyTable" (name) values ('Row 4');
我很惊讶得到
id name
=========== ==============
1 Row 1
2 Row 2
!!! ---> 3 Row 4
有没有办法更改服务器配置以防止此行为。我也很高兴收到任何其他建议,即在普遍SQL中创建一个可靠的唯一整数。
根据Autoincrement
文档(此处(,这似乎是预期的行为。具体来说,在文档中,它说:
如果指示希望数据库引擎分配下一个 值,通过在插入或更新中输入零 (0( 值, 数据库只需找到最大数字,加 1,然后插入 结果值。 因为在示例中给出的最大数字是"2",所以下一个自动增量值将是"3"。 在自动增量使用中防止此行为的唯一方法是在插入时指定值。
如果您确实想要一些独特的东西,您可以使用此处文档中描述的UNIQUEIDENTIFIER
。
下面是一个示例:
create table "MyTable" (id identity not null, gid UNIQUEIDENTIFIER default newid(), name varchar(50));
insert into "MyTable" (name) values ('Row 1');
insert into "MyTable" (name) values ('Row 2');
insert into "MyTable" (name) values ('Row 3');
select * from "mytable";
delete from "MyTable" where id = 3;
insert into "MyTable" (name) values ('Row 4');
select * from "mytable";
结果是:
<<<<<<<<<<<<<<<<<<<<<<<<
id gid name
=========== ==================================== ==================================================
1 1F74A3E5-6EFC-4382-81DA-94F58710AD73 Row 1
2 B5FEFA7A-F85B-486A-A7CA-9615EAD1A601 Row 2
3 E327B2CF-D01D-4039-BB83-CAD966C72131 Row 3
<<<<<<<<<<<<<<<<<<<<<<<<
id gid name
=========== ==================================== ==================================================
1 1F74A3E5-6EFC-4382-81DA-94F58710AD73 Row 1
2 B5FEFA7A-F85B-486A-A7CA-9615EAD1A601 Row 2
3 66F0E55C-52CF-4183-87EE-2C0FDD6E45B6 Row 4