在InnoDB和MyISAM中更新Autoincrement列值时的差异
我是从《MySQL Admin Cookbook》一书中看到这个问题的,有一定的隐蔽性,遂记之。友情提示:本文测试所用的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中的每一行独立看待。