在InnoDB和MyISAM中更新Autoincrement列值時的差異

作者: 老王  來源: 老王的技術手冊  發布時間: 2010-12-05 15:27  閱讀: 1177 次  推薦: 0   原文鏈接   [收藏]  

  我是從《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中的每一行獨立看待。

0
0
 
標簽:MySQL InnoDB
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()