如果你為一個表指定AUTO_INCREMENT列,在資料詞典裡的InnoDB表句柄包含一個名為自動增長計數器的計數器,它被用在為該列賦新值。自動增長計數器僅被存儲在主記憶體中,而不是存在磁盤上。
SELECT MAX(ai_col) FROM T FOR UPDATE;
語句取回的值逐次加一,并被賦給列和自動增長計數器。如果表是空的,值1被賦予該列。如果自動增長計數器沒有被初始化,而且使用者調用為表T顯示輸出的SHOW
TABLE
STATUS語句,則計數器被初始化(但不是增加計數)并被存儲以供随後的插入使用。注意,在這個初始化中,我們對表做一個正常的獨占讀鎖定,這個鎖持續到事務的結束。
InnoDB對為新建立表的初始化自動增長計數器允許同樣的過程。
注意,如果使用者在INSERT中為AUTO_INCREMENT列指定NULL或者0,InnoDB處理行,就仿佛值還沒有被指定,且為它生成一個新值。
自動增長計數器被初始化之後,如果使用者插入一個明确指定該列值的行,而且該值大于目前計數器值,則計數器被設定為指定列值。如果沒有明确指定一個值,InnoDB給計數器增加一,并且賦新值給該列。
當通路自動增長計數器之時,InnoDB使用專用的表級的AUTO-INC鎖定,該鎖持續到目前SQL語句的結束而不是到業務的結束。引入了專用鎖釋放政策,來為對一個含AUTO_INCREMENT列的表的插入改善部署。兩個事務不能同時對同一表有AUTO-INC鎖定。
注意,如果你復原從計數器獲得數的事務,你可能會在賦給AUTO_INCREMENT列的值的序列中發現間隙。
如果使用者給列賦一個指派,或者,如果值大過可被以指定整數格式存儲的最大整數,自動增長機制的行為不被定義。
在CREATE TABLE和ALTER TABLE語句中,InnoDB支援AUTO_INCREMENT = n 表選項來設定計數器初始值或變更目前計數器值。
原文連結:[http://wely.iteye.com/blog/2329407]