mysql-innodb/myisam 批量insert和Autoincrement

最進看了老王的文章 http://hi.baidu.com/thinkinginlamp/?page=1,寫了關於批量insert的東西,想到了以前自己在批量插入數據時,如果中途某條記錄插入失敗了,會是什麼效果。但是當時自己並沒有去深入研究,看了老王的文章後,自己也做了一個測試,記錄如下,和老王的文章差不多,僅僅是自己記錄一下當作筆記,方便自己以後複習。
以下是測試流程:
mysql> CREATE TABLE test_myisam (
    -> id INT(11) unsigned NOT NULL AUTO_INCREMENT,
    -> textvalue VARCHAR(30),
    -> PRIMARY KEY (id)
    -> ) ENGINE=MyISAM;
Query OK, 0 rows affected (0.51 sec)

mysql> CREATE TABLE test_innodb (
    -> id INT(11) unsigned NOT NULL AUTO_INCREMENT,
    -> textvalue VARCHAR(30),
    -> PRIMARY KEY (id)
    -> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.69 sec)

mysql> INSERT INTO test_innodb
    -> VALUES (0,'Zero'),(1,'One'),
    -> (2,'Two'),(3,'Three');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

mysql> show create table test_innodb;
+-------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table       | Create Table                                                                                                                                                                                     |
+-------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test_innodb | CREATE TABLE `test_innodb` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `textvalue` varchar(30) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 | 
+-------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.38 sec)

mysql> INSERT INTO test_myisam
    -> VALUES (0,'Zero'),(1,'One'),
    -> (2,'Two'),(3,'Three');
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

mysql> show create table test_myisam;
+-------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table       | Create Table                                                                                                                                                                                     |
+-------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| test_myisam | CREATE TABLE `test_myisam` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `textvalue` varchar(30) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 | 
+-------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.61 sec)
mysql> select * from test_myisam;

+----+-----------+
| id | textvalue |
+----+-----------+
|  1 | Zero      | 
+----+-----------+
1 row in set (0.42 sec)


mysql> select * from test_innodb;
Empty set (0.00 sec)

可以看到,innodb在中途某條數據插入失敗後,以前插入的數據不會生效,但是 AUTO_INCREMENT的值卻增加到了記錄的條數,雖然數據沒有入庫,myisam確不是,中途一條記錄失敗了,插入的數據會入庫,但後面的沒有,AUTO_INCREMENT的值也只是增加到了插入成功的記錄數。

猜測:innodb是支持事務的引擎,事務是執行任務的最小單位,任務要麼全成功,要麼不執行,所以中途一條記錄插入失敗時,會回滾

但是myisam就不一樣了,數據一條一條的插入,報錯就直接退出

以上只是個人的理解。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章