普遍 SQL 重用已删除的主键



我最近遇到了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                                             

相关内容

  • 没有找到相关文章

最新更新