首页 > 解决方案 > Pervasive 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中创建一个可靠的唯一整数。

标签: pervasivepervasive-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                                             

推荐阅读