您现在的位置是:首页 > 学无止境
在InnoDB和MyISAM中更新Autoincrement
转载自:http://hi.baidu.com/thinkinginlamp/blog/item/ca000fb3a39eb3aad8335a7d.html
作者:老王
友情提示:本文测试所用的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中的每一行独立看待。
友情提示:
这是引擎处理的差异,不算是Bug,但可能会造成一些非预期的结果,所以还是值得注意的。
补充内容:
在InnoDB中,这个特性是可配置的,就是innodb_autoinc_lock_mode
,缺省值是1,当值为1或者2时,会发生文中情况,否则不会。
上一篇:PHP函数的实现原理及性能分析
下一篇:CSS Bug Table
文章评论
- 登录后评论
点击排行
-
php-fpm安装、配置与优化
转载自:https://www.zybuluo.com/phper/note/89081 1、php中...
-
centos下postgresql的安装与配置
一、安装(以root身份进行)1、检出最新的postgresql的yum配置从ht...
-
Mysql的大小写敏感性
MYSQL在默认的情况下查询是不区分大小写的,例如:CREATE TABLE...
-
关于URL编码
转载自:http://www.ruanyifeng.com/blog/2010/02/url_encoding....
-
header中的Cache-control
网页的缓存是由HTTP消息头中的“Cache-control”来控制的,常见的...