AUTO_INCREMENT列在InnoDB里如何工作
来源:互联网 发布:修改积分软件. 编辑:程序博客网 时间:2024/05/22 02:10
如果你为一个表指定AUTO_INCREMENT列,在数据词典里的InnoDB表句柄包含一个名为自动增长计数器的计数器,它被用在为该列赋新值。自动增长计数器仅被存储在主内存中,而不是存在磁盘上。
InnoDB使用下列算法来为包含一个名为ai_col的AUTO_INCREMENT列的表T初始化自动增长计数器:服务器启动之后,当一个用户对表T做插入之时,InnoDB执行等价如下语句的动作:
SELECT MAX(ai_col) FROM T FOR UPDATE;语句取回的值逐次加一,并被赋给列和自动增长计数器。如果表是空的,值1被赋予该列。如果自动增长计数器没有被初始化,而且用户调用为表T显示输出的SHOW TABLE STATUS语句,则计数器被初始化(但不是增加计数)并被存储以供随后的插入使用。注意,在这个初始化中,我们对表做一个正常的独占读锁定,这个锁持续到事务的结束。
InnoDB对为新创建表的初始化自动增长计数器允许同样的过程。
注意,如果用户在INSERT中为AUTO_INCREMENT列指定NULL或者0,InnoDB处理行,就仿佛值还没有被指定,且为它生成一个新值。
自动增长计数器被初始化之后,如果用户插入一个明确指定该列值的行,而且该值大于当前计数器值,则计数器被设置为指定列值。如果没有明确指定一个值,InnoDB给计数器增加一,并且赋新值给该列。
当访问自动增长计数器之时,InnoDB使用专用的表级的AUTO-INC锁定,该锁持续到当前SQL语句的结束而不是到业务的结束。引入了专用锁释放策略,来为对一个含AUTO_INCREMENT列的表的插入改善部署。两个事务不能同时对同一表有AUTO-INC锁定。
注意,如果你回滚从计数器获得数的事务,你可能会在赋给AUTO_INCREMENT列的值的序列中发现间隙。
如果用户给列赋一个赋值,或者,如果值大过可被以指定整数格式存储的最大整数,自动增长机制的行为不被定义。
在CREATE TABLE和ALTER TABLE语句中,InnoDB支持AUTO_INCREMENT = n 表选项来设置计数器初始值或变更当前计数器值。因在本节早先讨论的原因,这个选项的影响在服务器重启后就无效了。
- AUTO_INCREMENT列在InnoDB里如何工作
- AUTO_INCREMENT列在InnoDB里如何工作
- 15.2.6.3. AUTO_INCREMENT列在InnoDB里如何工作
- 14.5.5 AUTO_INCREMENT Handling in InnoDB 在InnoDB AUTO_INCREMENT处理
- 自增列(auto-increment)是如何在 InnoDB 中工作的
- AUTO-INC锁和AUTO_INCREMENT在InnoDB中处理方式
- 多线程在.NET里如何工作
- 存储过程如何在Access里工作?
- 如何在sql-server里更改列名?
- 为在innodb中什么主键用auto_increment效率会提高
- 如何在工作的前三年里快速成长
- 如何在现有字段中添加auto_increment约束
- GridView使用技巧之:如何在RowCommand里获取模板列里绑定的内容?
- GridView使用技巧之:如何在RowCommand里获取模板列里绑定的内容?
- GridView使用技巧之:如何在RowCommand里获取模板列里绑定的内容?
- mysql 自增列 AUTO_INCREMENT
- mysql自增列(auto_increment)
- INNODB引擎下auto_increment的应用
- ios学习一:objective-c面向对象的一些术语(来源objective-c基础编程)
- C语言中的两个!号
- 中国城市电话区号对照表(不包括台湾省)
- linux增加/删除虚拟IP地址
- struts2中的s:if标签的用法
- AUTO_INCREMENT列在InnoDB里如何工作
- C++中的vector简单使用实例
- C#遍历实体的所有属性并为属性赋值
- Comet:基于 HTTP 长连接的“服务器推”技术
- I2C设备驱动的编写(一)
- winform设置文本框ctrl+A和双击实现全选
- memcache扩展(0.2版本)源代码讲解(memcache_set)
- 网址
- sqlite基础教程