2009-11-30 160 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

相關問題