有时候新建的表需要对自增列指定初始值,但是有时候会出现明明指定过的初始值却被重置的现象。下面以一个小实验来说明这个问题:

MySQL version:5.1.42 OS:redhat5.3

无废话,建张表先:

代码

CREATE TABLE `sbtest1` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `k` int(10) unsigned NOT NULL DEFAULT '0',
  `c` char(120) NOT NULL DEFAULT '',
  `pad` char(60) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `k` (`k`)
) ENGINE=InnoDB AUTO_INCREMENT=20000000 DEFAULT CHARSET=latin1;

诸位看官可以看见我指定了auto_increment=20000000。

表建好后,如果紧接着插数据,那么此现象是不会出现的:

代码

mysql> insert into sbtest1(k,pad) values(123,'what are you doing');
Query OK, 1 row affected (0.00 sec)

mysql> select * from sbtest1;
+----------+-----+---+--------------------+
| id       | k   | c | pad                |
+----------+-----+---+--------------------+
| 20000000 | 123 |   | what are you doing |
+----------+-----+---+--------------------+
1 row in set (0.00 sec)

那什么时候?嗯,确切地说是做什么样的操作,重置现象才会出现呢?看实验:

代码

CREATE TABLE `sbtest1` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `k` int(10) unsigned NOT NULL DEFAULT '0',
  `c` char(120) NOT NULL DEFAULT '',
  `pad` char(60) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `k` (`k`)
) ENGINE=InnoDB AUTO_INCREMENT=20000000 DEFAULT CHARSET=latin1

mysql> quit
Bye
[root@test_2 ~]# service mysqld restart
mysql> show create table sbtest1 \G
*************************** 1. row ***************************
       Table: sbtest1
Create Table: CREATE TABLE `sbtest1` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `k` int(10) unsigned NOT NULL DEFAULT '0',
  `c` char(120) NOT NULL DEFAULT '',
  `pad` char(60) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `k` (`k`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

这时,auto_increment的值被重置了!

通过以上的小实验,结合手册就能理解为什么会发生这种现象了:

如果对某张innodb表指定了auto_increment,那么innodb就会在data dictionary为它维护一个auto_increment计数器,注意:这个计数器只存储在内存中,不会写在disk上。
那么 innodb在DB重启后,如何对这个计数器进行初始化呢(结合实验中的这张表来说明)?
InnoDB在数据库重新启动后,它会对指定过 auto_increment的表(sbtest1)做这样一个操作:

SELECT MAX(id) FROM sbtest1 FOR UPDATE;

然后将这条语句取得的值+1赋给被指定auto_increment的字段和在内存中的这张表的计数器。如果表是空的,那么这个值将会是1.

解决方法:
1.重建完表后,插入数据之前不要重启(说白了,就是要保证内存的数据不会释放)
2.插入一条脏数据

转载于:https://www.cnblogs.com/minglog/archive/2010/04/02/1703278.html

InnoDB的auto_increment指定值被重置问题相关推荐

  1. 链表问题14——在单链表种删除指定值的节点(方法二)

    题目 题目可参考上一篇文章,删除链表中的指定值 思路 方法二:不用任何容器,直接调整.时间复杂度O(N),空间复杂度O(1) 因为最后计划返回链表头,所以先遍历链表按顺序找到第一个不等于num的节点作 ...

  2. MySQL/InnoDB处理AUTO_INCREMENT(二)

    2019独角兽企业重金招聘Python工程师标准>>> MySQL/InnoDB处理AUTO_INCREMENT(二) http://dev.mysql.com/doc/refman ...

  3. 在二叉树中找到累加和为指定值的最长路径长度

    在二叉树中找到累加和为指定值的最长路径长度 给定一棵二叉树的头节点 head 和一个 32 位整数 sum,二叉树节点值类型为整型,求累加和为 sum 的最长路径长度.路径是指从某个节点往下,每次最多 ...

  4. 牛客题霸 NC9 二叉树中是否存在节点和为指定值的路径

    https://www.nowcoder.com/practice/508378c0823c423baa723ce448cbfd0c 解决方案 Go func hasPathSum(root *Tre ...

  5. 左神算法:在二叉树中找到累加和为指定值的最长路径长度(Java版)

    本题来自左神<程序员代码面试指南>"在二叉树中找到累加和为指定值的最长路径长度"题目. 题目 给定一棵二叉树的头节点 head 和一个 32 位整数 sum,二叉树节点 ...

  6. python豆瓣历史评分_Python实战-爬取豆瓣top250评分高于指定值的电影信息

    思路 1. 要获得怎么样的数据 2. 找到数据来源 3. 模拟浏览器发送请求获得数据 4. 处理数据,保存数据 第一步: 在这里数据是豆瓣top250中高于指定分数的电影信息 信息有:名称,评分,格言 ...

  7. 牛客题霸 [二叉树中是否存在节点和为指定值的路径] C++题解/答案

    牛客题霸 [二叉树中是否存在节点和为指定值的路径] C++题解/答案 题目描述 给定一个二叉树和一个值\ sum sum,判断是否有从根节点到叶子节点的节点值之和等于\ sum sum 的路径, 例如 ...

  8. jquery简单原则器(匹配索引为指定值的元素)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. LeetCode 1865. 找出和为指定值的下标对(哈希)

    文章目录 1. 题目 2. 解题 1. 题目 给你两个整数数组 nums1 和 nums2 ,请你实现一个支持下述两类查询的数据结构: 累加 ,将一个正整数加到 nums2 中指定下标对应元素上. 计 ...

最新文章

  1. 云服务器加密机,卫士通云服务器密码机
  2. pyqt5中QWidget的show 一闪而过的原因及解决办法实例
  3. C语言中的标识符作用域
  4. es6 --- 模块
  5. 双11还能创造什么新技术?
  6. 如何区分常见 USB 接口类型
  7. 优化程序性能(CSAPP)
  8. android 迅雷 好用版本,迅雷不限速版本安卓下载-迅雷不限速版 安卓版v6.6.6-PC6安卓网...
  9. 第一个动态网页——留言板
  10. 【Java线程池实现原理及其在美团业务中的实践】
  11. VC++两万字总结Windows系统中的Layered分层窗口技术(附源码)
  12. 泛泛而谈webservice
  13. 【深坑】记一次MacBook pro 恢复出厂设置抹盘重装系统
  14. Today is a special day
  15. 使用MATLAB计算一幅图像的熵
  16. 博客园Markdown排版技巧
  17. ERP和MES、QAS以及APS在制造企业信息化的了解
  18. 百度云加速提升网站访问速度
  19. seo网络优化是什么?
  20. 浪潮服务器nf5270m5做raid_一文读懂服务器centos7.0安装指导指南(详细)

热门文章

  1. 前端学习(3033):vue+element今日头条管理-反馈
  2. [css] 说说你对css盒子模型的理解
  3. [css] 为什么说不提倡用1px的小尺寸图片做背景平铺?
  4. [css] 移动端1px像素的问题及解决方案是什么?
  5. 前端学习(2828):数组和对象循环
  6. 前端学习(2800):实现news-item的封装
  7. 前端学习(2679):安装mysql_front
  8. mybatis学习(42):mybatis的一级缓存
  9. 第二十五期:知乎用Go替代Python,说明了啥
  10. 第二十七期:德国工业4.0眼里“工业互联网”与“智能制造”