在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;
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');
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');
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
2 Zero
總結:當表建立后,Autoincrement列的初始值是1,當我們第一次執行SQL,用0插入的時候,實際上就是被當1插入,而后面的數據又存在1, 所以重復報錯,不過此時Autoincrement的當前值卻已經被更新成了,只是InnoDB把它更新成了5,而MyISAM把它更新成了2,所以當我們執行第二次操作時產生了差異。從結果看,在更新Autoincrement的當前值時,InnoDB把多行插入SQL作為一個整體來看待,而MyISAM則把多行插入SQL中的每一行獨立看待。
全站熱搜