最近我遇到了一个非常奇怪的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中创建创建可靠唯一的整数的任何其他建议,我也将感到高兴。
答案 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