普及SQL重用已删除的主键

时间:2018-07-02 13:50:46

标签: pervasive pervasive-sql

最近我遇到了一个非常奇怪的PSQL(v11)行为:

如果我创建一个带有标识列的表,添加一些记录,然后删除最后一行,则该行键将被重用!

#![feature(const_fn)]

pub const fn results() -> [i8; 6] {
    unimplemented!()
}

到目前为止一切顺利

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"

然后当我删除“第3行”

          id   name                                              
 ===========   ============
           1   Row 1                                             
           2   Row 2                                             
           3   Row 3

并添加新行

delete from "MyTable" where id = 3;

我很惊讶得到

insert into "MyTable" (name) values ('Row 4');

是否可以将服务器配置更改为防止此行为。对于在普及型SQL中创建创建可靠唯一的整数的任何其他建议,我也将感到高兴。

1 个答案:

答案 0 :(得分:0)

根据Autoincrement文档(here),这似乎是预期的行为。具体来说,在文档中说:

  

如果您指示您希望数据库引擎分配下一个   通过在插入或更新中输入零(0)值,   数据库只查找最高编号,加1,然后插入   结果值。   因为在给出的示例中,最大的数字是“ 2”,所以下一个自动增量值将是“ 3”。   防止自动增量使用中此行为的唯一方法是在插入时指定值。

如果您确实想要一些独特的东西,可以使用文档here中所述的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