2009-11-30 161 views
2

我对informix db上的主键上使用的串行数据类型有个疑问。Informix:当您使用serial/serial8主键删除一行时会发生什么?

如果我删除一行,串行密钥是否会进行计数,或者是否会重新调整已删除的行?

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

+0

相关主题请参阅: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

回答

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 

显然,接下来的三个插入会失败,一个会成功,另外两个会失败,然后他们会在接下来的几十亿次插入中获得成功。

+0

+1我刚刚了解到VALUES中的0并不总是表示0 :)。我通常使用表单INSERT INTO s(v)VALUES('Row 8'); (跳过连续列) 请注意,如果您在INSERT值中指定了其他数据库(例如PostgreSQL),则会将0插入到串行列中。 另外使用“而不是”是Informix特有的 – 2009-12-01 09:49:13

+0

是的 - Informix SERIAL的行为一直如此,因为之前有一个基于SQL的Informix版本,并且单引号和双引号(两种工作)也有蜜蜂是Informix自古以来的一部分 – 2009-12-01 13:39:28

+0

那么informix自动重新使用未使用或删除的串行值时会自动重新使用它? – 2009-12-02 12:46:11

相关问题