InnoDBとMyISAMでAutoincrementカラム値を更新した場合の差異

6718 ワード

私は『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'
このとき1行も実行されませんでした.
同じSQLを再実行するには、次の手順に従います.
   
   
   
   
INSERT INTO enumerator
VALUES ( 0 , ' Zero ' ),( 1 , ' One ' ),
(
2 , ' Two ' ),( 3 , ' Three ' );

結果は成功しました.表のデータは次のとおりです.
  1 One  2 Two  3 Three  5 Zero
MyISAMの状況を見てみましょう.
同じテーブル構造で、タイプがMyISAMになっただけで、同じSQLテストを2回使用して、毎回エラーが発生します.
  #1062 - Duplicate entry '1' for key 'PRIMARY'
表のデータは次のとおりです.
   
   
   
   
1 Zero
2 Zero

まとめ:表が作成されると、Autoincrement列の初期値は1であり、SQLを初めて実行し、0で挿入すると、実際には1が挿入され、後のデータが1が存在するため、エラーが繰り返されるが、このときAutoincrementの現在の値は更新され、InnoDBが5に更新しただけで、MyISAMが2に更新したため、2回目の操作を実行すると差が生じた.結果として、Autoincrementの現在の値を更新すると、InnoDBは複数行のSQL挿入を全体として見ているが、MyISAMは複数行のSQL挿入の各行を独立して見ている.