2014-11-21 74 views
0

我正在使用一個項目的數據庫插入東西,我有一個自動增量。但是,隨機地,自動增量ID開始計數錯誤。關閉自動增加5個數字?

例如,當我插入另一行的最後一個表中有227的ID,它應該自動將其指定爲228,而是它跳到232.如何解決這個問題?

+1

除非你刪除了228到231行(或試圖插入它們,但由於約束,觸發器或其他回滾而失敗) – 2014-11-21 16:56:31

+1

'ALTER TABLE table_name AUTO_INCREMENT = 1'試試這個 – 2014-11-21 16:57:51

+0

在phpmyadmin上,繼續表,選項卡操作,並查看AUTO_INCREMENT的值 – 2014-11-21 16:59:53

回答

5

自動增量並不意味着使用表格中下一個最高數字。

有幾個原因自動增加的編號是不連續的。

  1. 自動遞增一步也許沒有1
  2. 以前的行可能已被刪除
  3. 交易插入到表可能已被回滾
  4. 的記錄可能已更新自動遞增列
  5. 自動增量啓動索引可能已通過DDL修改進行了更改。

很可能有一些其他情況然而這將導致此。

要回答「我該如何解決這個問題?」的問題,不要打擾,ID應該是唯一的,沒有別的,ID連續通常沒有用(除非你正在做分頁假設他們是連續的,這是一個不好的假設)。

0

自動增量編號可以提前由數據庫服務器收集。而不是隻得到一個要求的數據庫,數據庫有時會得到5(或10或100),並更新下一個數字的長期存儲,以分配下一個+5(或10或100)。然後下一次分配下一個分配給內存的速度要快得多,特別是因爲它不必將下一個分配給磁盤。

時間表:

  • 當被問及下一個數字
  • 沒有得到一個在內存中以便:
    • 轉到磁盤獲取下一個(叫它)與
    • 更新磁盤a + 100
    • 給出提問者
    • 在內存中存儲+ 1作爲下一個給出
  • 常見爲下一個數字
  • 賦予它一個+ 1和在存儲器

存儲+ 2 ...等。

但是,如果它給了所有的數字之前,DB服務器被停止,它將重新啓動然後當它會尋找下一個號碼並找到+ 100 - 因此缺口。自動編號一般保證發出不斷增加的值,並且應該始終是唯一的(注意當達到最大值時發生的情況)。他們通常但不總是連續的。(Oracle對於Sequences有相同的作用,我已經用了一段時間,但是有了一個序列,你可以指定一個緩存大小,保證順序分配的唯一方法是讓緩存大小爲零,這是較慢的)