InnoDBとMyISAMでAutoincrementカラム値を更新した場合の差異
私は『MySQL Admin Cookbook』という本からこの問題を見て、一定の隠蔽性があったので、覚えています.友情のヒント:このテストで使用したMySQLバージョンは5.1.44-communityで、他のバージョンはテストされていません.結果に違いがある可能性があります.
まずInnoDBの状況を見てみましょう.
SQLを実行します.
エラー:
#1062 - Duplicate entry '1' for key 'PRIMARY'
このとき1行も実行されませんでした.
同じSQLを再実行するには、次の手順に従います.
結果は成功しました.表のデータは次のとおりです.
1 One 2 Two 3 Three 5 Zero
MyISAMの状況を見てみましょう.
同じテーブル構造で、タイプがMyISAMになっただけで、同じSQLテストを2回使用して、毎回エラーが発生します.
#1062 - Duplicate entry '1' for key 'PRIMARY'
表のデータは次のとおりです.
まとめ:表が作成されると、Autoincrement列の初期値は1であり、SQLを初めて実行し、0で挿入すると、実際には1が挿入され、後のデータが1が存在するため、エラーが繰り返されるが、このときAutoincrementの現在の値は更新され、InnoDBが5に更新しただけで、MyISAMが2に更新したため、2回目の操作を実行すると差が生じた.結果として、Autoincrementの現在の値を更新すると、InnoDBは複数行のSQL挿入を全体として見ているが、MyISAMは複数行のSQL挿入の各行を独立して見ている.
まず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挿入の各行を独立して見ている.