在InnoDB和MyISAM中更新Autoincrement列值时的差异

转载自:http://hi.baidu.com/thinkinginlamp/blog/item/ca000fb3a39eb3aad8335a7d.html

作者:老王

 

友情提示:本文测试所用的MySQL版本是5.1.44-community,其它版本未测试,结果可能有差异。

先看看InnoDB中的情况:

CREATE TABLE enumerator (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
textvalue VARCHAR(30),
PRIMARY KEY (id)
) ENGINE=InnoDB;

然后执行SQL:

INSERT INTO enumerator
VALUES (0,'Zero'),(1,'One'),
(2,'Two'),(3,'Three');

报错:

#1062 - Duplicate entry '1' for key 'PRIMARY'

此时一行也没有被执行。

再次执行同样的SQL:

INSERT INTO enumerator
VALUES (0,'Zero'),(1,'One'),
(2,'Two'),(3,'Three');

结果成功了,表数据如下:

1 One
2 Two
3 Three
5 Zero

再看看MyISAM中的情况:

同样的表结构,只是类型变成了MyISAM,使用同样的SQL测试两次,每次都会报错:

#1062 - Duplicate entry '1' for key 'PRIMARY'

表数据如下:

1 Zero
2 Zero

总结:当表建立后,Autoincrement列的初始值是1,当我们第一次执行SQL,用0插入的时候,实际上就是被当1插入,而后面的数据又存在1, 所以重复报错,不过此时Autoincrement的当前值却已经被更新成了,只是InnoDB把它更新成了5,而MyISAM把它更新成了2,所以当我 们执行第二次操作时产生了差异。从结果看,在更新Autoincrement的当前值时,InnoDB把多行插入SQL作为一个整体来看待,而 MyISAM则把多行插入SQL中的每一行独立看待。

友情提示: 这是引擎处理的差异,不算是Bug,但可能会造成一些非预期的结果,所以还是值得注意的。

补充内容: 在InnoDB中,这个特性是可配置的,就是innodb_autoinc_lock_mode ,缺省值是1,当值为1或者2时,会发生文中情况,否则不会。

你可能感兴趣的:(关系型数据库)