pervasive - 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中创建一个可靠的唯一整数。
解决方案
根据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
推荐阅读
- javascript - 如何解决 Node.js 中的“无法读取未定义的属性”
- python - 使用 lambda 的 relu 激活函数
- javascript - 我不明白为什么“附近的地方”按钮不起作用
- oracle - 物化视图是虚拟表还是带有真实数据的真实表?
- javascript - 如何使用 Selenium webdriver-js 使用 Edge 浏览器
- python - 从列表创建数据框时出现内存错误
- ios - 制作当前位置。Mapkit 的 swiftui 按钮
- square-connect - 方形支付:如何保护“存档卡”免受数据泄露
- vb.net - VB.NET/ 从 codeDOM 编译器导入命名空间
- excel - 无法通过其他工作簿子程序更改单元格格式