2016-07-14 28 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

所以这不是一个错误,谢谢你的帮助:) –