Friday, 9 March 2007

Using AUTO_INCREMENT field in MySQL

AUTO_INCREMENT,是MySQL数据库中,字段定义当中的一个可选属性,可以用来对每个纪录产生唯一标识符。简单的说,就是“自增加”数字字段。当我们不断地往数据表中写入数据的时候,auto increment字段的数值会不断地增加,并且这种增加是连续的。

前些日,James说,在他的那个数据收集程序中,使用了auto increment字段作为记录的ID。但他遇到问题是,该字段出现了“间隔”,ID号并不是我们认为的那样是连续的,出现了gap。他的程序是Python写的一个多线程、多路数据输入的数据收集程序,MySQL数据库接口当然就是那个MySQLdb。这里,就不去探讨James是如何发现和解决问题的。最后的结果,是在某一个线程中,虽然发出了insert指令,但是却没有commit。补上commit,就解决问题了。( 显然,他在这里使用了支持transaction的table,也没有打开数据库连接的“自动commit”。)

仔细想想,这个问题还是蛮有意思的。在我以前的认识中,insert指令在没有commit之前,不应该对DB有任何影响。但是在这里,一旦发出的insert指令,是针对一个包含了auto increment字段的表,那么MySQL就会立即“预先”将latest ID分配给该纪录,即使还没有commit该insert指令。之后的其它insert指令,则会获得后续更新的ID。如果有insert语句最终并没有commit,就会造成auto increment字段的不连续。

这样的结果表明,auto increment字段在MySQL收到insert语句的时候,就已经修改了内部的计数器,而不是等到commit的时候才动作,并且这个动作不可逆。

0 Comments:

Post a Comment

<< Home