我对informix db上的主键上使用的串行数据类型有个疑问。Informix:当您使用serial/serial8主键删除一行时会发生什么?
如果我删除一行,串行密钥是否会进行计数,或者是否会重新调整已删除的行?
那么如果当前行是序列号5,我删除序列号为3的数字行,下一个值是6并继续进行?是现在被删除的序列号3永远丢失不再被使用吗?
我对informix db上的主键上使用的串行数据类型有个疑问。Informix:当您使用serial/serial8主键删除一行时会发生什么?
如果我删除一行,串行密钥是否会进行计数,或者是否会重新调整已删除的行?
那么如果当前行是序列号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位计数器。)
请注意,您可以手动插入'missing'值 - 例如3或7.但是,IDS不会为您做到这一点。
@iQ问:
因此,没有Informix的自动当它环绕重新使用未使用的或删除序列值?
不是。该值回到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
显然,接下来的三个插入会失败,一个会成功,另外两个会失败,然后他们会在接下来的几十亿次插入中获得成功。
+1我刚刚了解到VALUES中的0并不总是表示0 :)。我通常使用表单INSERT INTO s(v)VALUES('Row 8'); (跳过连续列) 请注意,如果您在INSERT值中指定了其他数据库(例如PostgreSQL),则会将0插入到串行列中。 另外使用“而不是”是Informix特有的 – 2009-12-01 09:49:13
是的 - Informix SERIAL的行为一直如此,因为之前有一个基于SQL的Informix版本,并且单引号和双引号(两种工作)也有蜜蜂是Informix自古以来的一部分 – 2009-12-01 13:39:28
那么informix自动重新使用未使用或删除的串行值时会自动重新使用它? – 2009-12-02 12:46:11
相关主题请参阅:http://stackoverflow.com/questions/5482528/how-can-i-find-out-which-rows-have-been-deleted和http://stackoverflow.com/questions/ 5494687/is-there-an-sql-function-which-generated-a-given-range-of-sequential-numbers – 2011-04-02 04:05:44