首页

源码搜藏网

首页 > 开发教程 > 数据库 >

在InnoDB和MyISAM中更新Autoincrement列值时的差异

创建时间:2013-05-06 17:44  

  我是从《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   标签: MySQLInnoDB   
上一篇:关于Redis的几个认识误区
下一篇:一个完整的用于追踪数据改变的解决方案

相关内容

热门推荐