sql - Informix:当您删除具有serial/serial8 主键的行时会发生什么?

标签 sql informix

我有一个关于 informix 数据库主键上使用的串行数据类型的快速问题。

如果我删除一行,序列号会继续计数还是会针对已删除的行重新调整?

因此,如果当前行是序列号 5,我删除序列号为 3 的数字行,下一个值为 6 并继续进行吗?现在被删除的序列号3是不是就永远丢失了,不能再用了?

最佳答案

SERIAL、SERIAL8 或 BIGSERIAL 使用的计数器单调递增,直至回绕。删除的值只是被删除。如果插入的文字值大于计数器,则调整计数器,以便下一个插入的值大一:

CREATE TABLE s (s SERIAL(2) NOT NULL PRIMARY KEY, v VARCHAR(20) NOT NULL);

INSERT INTO s(s,v) VALUES(0, "Row 2");
INSERT INTO s(s,v) VALUES(0, "Row 3");
INSERT INTO s(s,v) VALUES(0, "Row 4");
INSERT INTO s(s,v) VALUES(0, "Row 5");
DELETE FROM s WHERE s = 3;
INSERT INTO s(s,v) VALUES(0, "Row 6");
INSERT INTO s(s,v) VALUES(8, "Row 8"); -- Skip 7
INSERT INTO s(s,v) VALUES(0, "Row 9");

SELECT * FROM s ORDER BY s;

这会生成结果:

          2     Row 2
          4     Row 4
          5     Row 5
          6     Row 6
          8     Row 8
          9     Row 9

所有类型的行为都相似。如果达到最大值(SERIAL 为 2^32-1,SERIAL8 和 BIGSERIAL 为 2^63-1),则计数器将回滚到零,但您可能会遇到未腾出空间被重用且主键拒绝的问题重复的行。一般来说,避免包裹它们。 (需要相当长的时间才能使它们换行,尤其是 64 位计数器。)

请注意,您可以手动插入“缺失”值 - 例如 3 或 7。但是,IDS 不会为您执行此操作。

@iQ 询问:

So does Informix automatically re-use the unused or deleted serial values when it wraps around?

不是真的。该值回绕到 1;如果值为1的行存在,则插入失败;如果没有,则成功;无论哪种方式,下一次尝试都会尝试 2。为了说明这一点,继续上一个示例停止的地方:

INSERT INTO s(s,v) VALUES(2147483647, "Row 2,147,483,647");
INSERT INTO s(s,v) VALUES(0, "Row next")     { 1 - Pass };
INSERT INTO s(s,v) VALUES(0, "Row next + 1") { 2 - Fail };
INSERT INTO s(s,v) VALUES(0, "Row next + 2") { 3 - Pass };
INSERT INTO s(s,v) VALUES(0, "Row next + 3") { 4 - Fail };
SELECT * FROM s ORDER BY s;

最终结果是:

          1     Row next            
          2     Row 2               
          3     Row next + 2        
          4     Row 4               
          5     Row 5               
          6     Row 6               
          8     Row 8               
          9     Row 9               
 2147483647     Row 2,147,483,647   

显然,接下来的 3 次插入会失败,1 次会成功,另外 2 次会失败,然后在接下来的数十亿次插入中它们会成功。

关于sql - Informix:当您删除具有serial/serial8 主键的行时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1819040/

相关文章:

mysql获取唯一日期的总和

java - 从 SQLite for java/android 的数据库表中删除除 top n 之外的所有内容

sql - Informix 中的日期格式

linux - 连接到安装了单声道的 Informix DB 时出现 ODBC 错误

sql - Informix:如何获取最后插入的记录的ID

file - 如何在 Informix 中打开和读取文件

linux - 跟踪 ODBC 对 Informix Client for Linux 的调用

mysql - 使用 case 语句查找百分比

SQL Server : CTE, 如何获取最后一行号

sql - db2 特定于不同行数的查询