`
IXHONG
  • 浏览: 450231 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

AUTO_INCREMENT列在InnoDB里如何工作

阅读更多

如果你为一个表指定AUTO_INCREMENT列,在数据词典里的InnoDB表句柄包含一个名为自动增长计数器的计数器,它被用在为该列赋新值。自动增长计数器仅被存储在主内存中,而不是存在磁盘上。 

InnoDB使用下列算法来为包含一个名为ai_col的AUTO_INCREMENT列的表T初始化自动增长计数器:服务器启动之后,当一个用户对表T做插入之时,InnoDB执行等价如下语句的动作:

 

[sql] view plain copy
 
  1. 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 表选项来设置计数器初始值或变更当前计数器值。

0
1
分享到:
评论

相关推荐

    MySQL AUTO_INCREMENT 主键

    而`AUTO_INCREMENT`属性则是在MySQL数据库系统中为某些整数类型的主键自动分配唯一值的功能。下面我们将深入探讨`AUTO_INCREMENT`与主键的相关知识点。 #### 1. 主键 (Primary Key) 主键是指在一个数据表中能够...

    怎么重置mysql的自增列AUTO_INCREMENT初时值

    在MySQL数据库中,自增列(AUTO_INCREMENT)是一种非常有用的特性,它允许表中的某列在插入新记录时自动递增其值。当你需要重置这个初始值时,可能是因为数据库进行了一些清理操作或者需要从特定数值开始重新计数。...

    解析mysql中的auto_increment的问题

    首先,让我们来理解auto_increment在不同存储引擎中是如何工作的。在MySQL中,最常用的两种存储引擎是InnoDB和MyISAM,它们处理自增ID的机制是不同的。 在InnoDB存储引擎中,auto_increment的值被存储在内存中的一...

    mysql中自增auto_increment功能的相关设置及问题

    - **InnoDB**:InnoDB引擎将最大ID存储在内存中,所以如果重启或执行`OPTIMIZE TABLE`操作,最大ID会丢失,新插入的记录ID将从删除前的最小未使用ID开始,即8。 5. **注意事项** - 自增字段通常用于主键,确保每...

    关于MySQL innodb_autoinc_lock_mode介绍

    MySQL的InnoDB存储引擎在处理带有`auto_increment`列的表时,会受到`innodb_autoinc_lock_mode`参数的影响。这个参数决定了插入数据时如何管理自动递增锁,从而在性能和数据安全性(主从数据一致性)之间取得平衡。 ...

    Mysql auto_increment 重新计数(让id从1开始)

    2. **自增ID的递增策略**:默认情况下,每次插入新行时,`auto_increment`会递增1,但可以通过设置`innodb_autoinc_lock_mode`来改变这一行为。 3. **多表共享自增ID**:在一个数据库中,可以通过设置多个表的`auto...

    python mysql自增字段AUTO_INCREMENT值的修改方式

    在之前得文章中我们说过,如果使用delete对数据库中得表进行删除,那么只是把记录删除掉,并且id的值...create table t4(id int auto_increment primary key, num int) engine=innodb default charset=utf8; 那么接下

    springboot mybatis多数据源加事务嵌套

    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; CREATE TABLE `city` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '城市编号', `province_id` int(10) unsigned NOT NULL COMMENT '省份...

    Java小区物业管理系统框架 html + css + jquery + jsp + ssm + mysql

    Java小区物业管理系统 ... 用户类型 管理员 admin ...) ENGINE=InnoDB AUTO_INCREMENT=45 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC; CREATE TABLE `charge` ( `id` int(11) NOT NULL AUTO_INCREMENT,

    中国省市、区、县、镇、乡5级联动sql文件

    ) ENGINE=InnoDB AUTO_INCREMENT=32 DEFAULT CHARSET=utf8 COMMENT='省份数据库'; CREATE TABLE `position_city` ( `id` int(11) NOT NULL AUTO_INCREMENT, `province_id` int(10) unsigned NOT NULL COMMENT '...

    8.MySQL存储引擎--MyISAM与InnoDB区别1

    在InnoDB中,AUTO_INCREMENT可以确保每个插入的行都有一个唯一的ID,而MyISAM则需要手动设置AUTO_INCREMENT的值。 删除数据 InnoDB和MyISAM在删除数据方面也有所不同。在InnoDB中,使用DELETE FROM table可以快速地...

    留言板

    本留言板B1-2011-11-1 包括用户:普通用户和管理员 普通用户功能: ------- 查看留言 发表留言 管理员: ... `id` int(5) NOT NULL AUTO_INCREMENT, ...) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

    ll-test.rar

    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(45) NOT NULL, `password` varchar(45) NOT NULL, `identify_type` ...

    springMVC的增删改查

    数据库自己建,然后再jdbc.properties 文件修改URL即可。表格代码如下 CREATE TABLE `t_user` ( `user_id` int(11) NOT NULL AUTO_INCREMENT, ...) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8;

    世界国家表+世界省份表+世界城市表_关联id_my数据表

    世界国家表+世界省份表+世界城市表 共3个数据表,相互之间通过id关联 其中省份表结构如下 CREATE TABLE `province` ( ...) ENGINE=InnoDB AUTO_INCREMENT=3836 DEFAULT CHARSET=utf8mb4 COMMENT='省份表';

    PostgreSQL AUTO INCREMENT(自动增长)

    在PostgreSQL数据库中,"AUTO_INCREMENT"特性是通过序列(Sequences)来实现的,它在新记录插入到表中时会自动生成一个唯一的数字。序列是一种特殊的数据类型,可以生成一系列连续的整数,用于为表中的字段赋值。在...

    世界国家表+世界省份表+世界城市表_关联id_my数据表.sql

    世界国家表+世界省份表+世界城市表 共3个数据表,相互之间通过id关联 其中省份表结构如下 CREATE TABLE `province` ( ...) ENGINE=InnoDB AUTO_INCREMENT=3836 DEFAULT CHARSET=utf8mb4 COMMENT='省份表';

    SpringBoot整合Redis

    下载后创建userinfo表格,修改自己的数据库密码,直接访问127.0.0.1:8081到Eureka主页面,访问127.0.0.1:8081/hello.json可以访问查询数据库获得数据 ...) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

    全球城市资源 sql 表 包含国际城市

    简单创建 sql 语句 CREATE TABLE `global` ( `id` int(10) unsigned zerofill NOT NULL AUTO_INCREMENT, ...) ENGINE=InnoDB AUTO_INCREMENT=4168 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='全球城市表';

    mysql 5.6 参数详解.docx

    1. `auto_increment_increment`: 这个变量定义了 AUTO_INCREMENT 列在每次自增时的增值,范围1到65535,默认值是1。例如,设置为2意味着每次生成的新序列值会增加2。 2. `auto_increment_offset`: 它设定了 AUTO_...

Global site tag (gtag.js) - Google Analytics