MySQL自增Id

在建表的时候用下面的语句:

id int auto_increment primary key    //创建一个字段名为 Id ,其在插入数据的时候每次自动增加

当插入数据时,可以忽略掉这个字段,这个Id的值会自动增加。

那么,这个Id的值每次加多少呢?从哪一个值开始增加呢?

一般情况下,这个Id从 1 开始,每次默认自增 1 。

可以用下面的两条语句(两者的差别后面会讲到)中的一种来查看:

show session variables like '%auto_increment%';

(或者 show global variables like '%auto_increment%';)

执行这个语句的结果如下图:


其中 auto_increment_increment对应的值表示 Id 的起始值,比如上图中该值为 1 ,表示 Id 从1开始增加;

而 auto_increment_offset 对应的值表示 Id 每次增加的幅度 ,比如上图中该值为 1 ,表示每次 Id 增加 1 ;


那么如果我们不想 Id 从默认的 1 开始,或者不想Id 每次增加 1 而是每次增加 10 那该如何设置呢 ,方法很简单,如下:

set session auto_increment_increment=5;

(或者 set global auto_increment_increment=5;)

这个语句表示将auto_increment_increment设置为5 ,即Id 从 5 开始往上增加;


设置auto_increment_offset 也是同样的方法

set session auto_increment_offset=10;

(或者 set global auto_increment_offset=10;)

这个语句表示将auto_increment_increment设置为10,即每次 Id 增加 10 ;


将这两条语句执行晚后,可以用上面说的查看语句来查看现在的情况,如下:



最后我们来看看红色标记出来的两个单词所表达的不同意思,

顾名思义,session表示一个会话,global 表示全局。相信作为程序猿的都知道是什么意思,

在MySQL数据库里面这两者操作的区别是:

session表示只是在当前会话的值,不管是查看还是设置,都只是在当前会话内,比如,你用session将Id 的起始值由1设置成了5,增幅设置成了10,那么在你没有关闭数据库的连接对数据进行一些操作的时候,Id 是从 5 开始增加的,每次增加10,但是当你关闭了连接再重新连接一次的时候Id 就恢复成了以前的值。

而global表示的是全局的,用global 设置的值在你关闭连接重新打开后你设置的值依旧是你之前设置的值,没有改变。


当你不指明session或者global的时候,这些语句依然可以执行,默认的是session;


如果你是在Java或者其他语言在自己的项目里面操作数据库,而对Id的起始值和增幅有所要求的话,建议在建表后用global设置,因为如果你用 session设置的话,当在Java里面用语句连接成功后,你之前设置的 Id 的起始值和 增幅就不是你之前设置的值了,因为你用这些语句重新连接了一次,每次新的连接都相当于一个新的 session。


希望我的总结对大家有所帮助。













<think>好的,我现在需要帮助用户了解MySQL中自ID的使用方法和实现原理。首先,我得回顾一下自己之前学过的相关知识,确保信息的准确性。记得自ID主要用于主键,自动生成唯一标识符,方便数据插入和管理。 用户提到了几个引用,我需要参考这些内容来组织回答。比如引用3提到自ID是自动生成唯一整数值的机制,通常在插入数据时自动分配。而引用4和引用5可能涉及自锁的模式和MyBatis如何获取自主键。另外,引用1和2提到了事务回滚可能导致ID跳跃的问题,这也是需要注意的地方。 首先,我应该从基本概念开始,解释什么是自ID,然后说明如何在建表时使用AUTO_INCREMENT关键字。接着,可以举一个建表的例子,比如创建用户表,主键设置为自。然后,插入数据时不需要指定主键,数据库会自动处理。 接下来,实现原理部分需要详细一些。根据引用3和4,自ID的原理涉及自计数器的存储,可能在内存中管理,但在MySQL 8.0之前是持久化到磁盘的。还要提到不同的锁模式,比如innodb_autoinc_lock_mode参数的不同设置,这影响并发插入时的ID分配方式。例如,模式1在确定数量的插入时批量获取ID,减少锁竞争,而模式2则是完全无锁,可能导致ID不连续。 然后,需要讨论注意事项,比如ID不连续的情况。事务回滚会导致自值不会回滚,所以会出现跳跃,这点引用2有提到。还有分库分表时的管理问题,每个表有自己的计数器,可能导致重复,需要特殊处理。批量插入时,如果语句不确定行数,可能需要更多的锁,影响性能,引用4中的模式1和模式0的区别可以在这里展开。 最后,应用场景部分可以提到主键、唯一索引、分页优化等,但要注意分页优化时使用自ID可能的问题,比如ID不连续导致分页不准确。 在组织内容时,要确保使用正确的LaTeX格式,比如行内公式用$...$,独立公式用$$...$$。同时,生成相关问题,帮助用户深入理解。例如,自ID用完怎么办?如何解决分库分表的ID冲突?不同锁模式的区别等。 需要检查是否有遗漏的信息,比如MyBatis如何获取自主键,可能在实现原理或应用场景中提到,比如useGeneratedKeys的使用,引用5中的方法。这部分可以在实现原理或应用场景中简要说明,比如在插入后获取生成的ID值。 最后,确保回答结构清晰,分点明确,引用正确标注,如引用[^1]、[^3]等。同时,语言要口语化,避免过于技术化的术语,但又要准确。</think>### MySQLID使用方法及实现原理 #### 一、基本概念 MySQLID(Auto Increment)是一种自动为表的主键列生成唯一递整数值的机制,常用于简化数据插入操作并确保主键唯一性[^3]。 #### 二、使用方法 1. **建表时定义自主键** 通过`AUTO_INCREMENT`关键字指定主键自属性: ```sql CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) ); ``` 2. **插入数据** 插入时**无需指定自列**,数据库自动分配ID: ```sql INSERT INTO users (name) VALUES ('Alice'); -- id自动生成 ``` 3. **获取自ID** 通过`LAST_INSERT_ID()`或编程接口获取最新生成的ID: ```sql SELECT LAST_INSERT_ID(); -- 返回最后一次插入的自ID ``` Java中可通过`Statement.RETURN_GENERATED_KEYS`获取(如MyBatis的`useGeneratedKeys`属性)[^5]。 --- #### 三、实现原理 1. **自计数器** - 每个表的自ID值通过计数器维护,计数器存储在内存中(MySQL 8.0前)或持久化到`mysql.innodb_table_stats`系统表(8.0+)[^3]。 - 计数器更新规则:每次插入操作后自1。 2. **锁机制与并发控制** 通过`innodb_autoinc_lock_mode`参数控制锁策略: - **模式0**:语句级锁,保证ID绝对连续(性能较差)[^4]。 - **模式1(默认)**:对不确定行数的插入(如`INSERT ... SELECT`)使用语句级锁,其他情况批量预分配ID[^4]。 - **模式2**:无锁模式,ID可能不连续但并发性能最高[^4]。 3. **ID分配流程** - 批量插入时预分配ID段(如插入5行,一次性分配5个ID)。 - 事务回滚时已分配的ID**不会回滚**,导致ID跳跃[^2]。 --- #### 四、注意事项 1. **ID不连续场景** - 事务回滚(如插入失败后ID仍递)。 - 批量插入预分配未完全使用(如预分配100个ID,实际插入50行,剩余50个丢弃)。 2. **分库分表管理** 多个表或数据库实例需通过以下方式避免ID冲突: - 设置不同起始值:`AUTO_INCREMENT = 1000` - 使用全局ID生成器(如Snowflake算法) 3. **自ID耗尽** - `INT`类型最大值为4294967295,耗尽后插入会报错。 - 解决方案:升级为`BIGINT`类型(范围:$2^{63}-1$)。 --- #### 五、应用场景 1. **主键唯一标识**:保证数据行的唯一性[^3]。 2. **分页优化**:通过自ID实现高效分页查询(如`WHERE id > 1000 LIMIT 10`)。 3. **关联表设计**:外键引用自ID确保数据一致性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值