您的位置:知识库 » 数据库

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

作者: 老王  来源: 老王的技术手册  发布时间: 2010-12-05 15:27  阅读: 1303 次  推荐: 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

数据库热门文章

    数据库最新文章

      最新新闻

        热门新闻