2016-07-14 30 views
0

我在圍棋writen一個簡單的代碼在MySQL DATABSE插入id不按照順序,我的表結構是:mysql的自動遞增時使用預處理語句

id PK, AUTO_INCREMENT 
name varchar(100) 
email varchar(100), UNIQUE 

和我去的代碼是:

stmt, err := c.mysql.Prepare("INSERT mytable SET name = ?, email = ?") 
checkError(err) 

res, err := stmt.Exec("My Name", "[email protected]") 
checkError(err) 

lastId, err := res.LastInsertId() 
checkError(err) 

當電子郵件未在登記臺上登記時,插入成功。

但是,當這封郵件註冊的銀行返回我唯一鍵的錯誤,這是正確的

當我插入獲得的唯一密鑰錯誤之後的記錄錯誤發生時,新的插入成功建立,但銀行ID是不正確的順序,例如

insert 'My name', '[email protected]' -> id returned 1 
insert 'My name', '[email protected]' -> id returned 2 
insert 'My name', '[email protected]' -> Unique key error returned 
insert 'My name', '[email protected]' -> id returned 4 
insert 'My name', '[email protected]' -> Unique key error returned 
insert 'My name', '[email protected]' -> Unique key error returned 
insert 'My name', '[email protected]' -> id returned 7 
+3

這是正確的行爲。爲什麼序列中的差距是一個問題? –

回答

3

從文檔:AUTO_INCREMENT Handling in InnoDB

在所有鎖模式(0,1和2),如果事務那生成 自動遞增值回滾,那些自動遞增值是 「丟失」。一旦爲自動增量列生成值,無論是否「INSERT-like」語句爲 已完成,以及是否將回滾包含的事務回滾爲 ,它都不能回滾。這些丟失的值不會被重複使用。因此,存儲在表的AUTO_INCREMENT列中的 值可能存在間隙。

它解釋了爲什麼auto_increment值存在差距。
請記住,auto_increment的用途僅僅是返回在列中保證唯一的值。每次插入失敗時,您都會有空白,每次刪除記錄然後插入新記錄......但這不應該是一個問題。

+0

所以這不是一個錯誤,謝謝你的幫助:) –