【MySQL】如何获取自增id

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:
 去"O"的业务支撑的时候,遇到一个开发询问如何获取到MySQL 的自增id,这里做一个总结,我们可以通过四种方式来获取MySQL 的自增id。
一 last_insert_id()
官方介绍如下:
“The ID that was generated is maintained in the server on a per-connection basis. This means that the value returned by the function to a given client is the first AUTO_INCREMENT value generated for most recent statement affecting an AUTO_INCREMENT column by that client. This value cannot be affected by other clients, even if they generate AUTO_INCREMENT values of their own. This behavior ensures that each client can retrieve its own ID without concern for the activity of other clients, and without the need for locks or transactions. ”

last_insert_id() 单个会话中最近一次执行的insert语句时表的自增id的值。不受其他的会话插入影响。

如果是新建的表,它的值为0

root@rac3 [yangyi]> create table t2(id int not null auto_increment primary key ,col varchar(10));                                    
Query OK, 0 rows affected (0.11 sec)
root@rac3 [yangyi]> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
|                0 |
+------------------+
1 row in set (0.01 sec)

如果向表中插入的记录,id自增,它的值为max(id),如果指定插入的id ,它的值为上一次插入的最大值。

root@rac3 [yangyi]> insert into t3 values(null,'sss');
Query OK, 1 row affected (0.00 sec)

root@rac3 [yangyi]> select last_insert_id();         
+------------------+
| last_insert_id() |
+------------------+
|                1 |
+------------------+
1 row in set (0.00 sec)
root@rac3 [yangyi]> insert into t3 values(2,'sss');  
Query OK, 1 row affected (0.00 sec)
root@rac3 [yangyi]> select last_insert_id();      
+------------------+
| last_insert_id() |
+------------------+
|                1 |
+------------------+
1 row in set (0.00 sec)

使用select last_insert_id()时要注意,当一次插入多条记录时,只是获得第一次插入的id值,务必注意!
root@rac3 [yangyi]> select last_insert_id();        
+------------------+
| last_insert_id() |
+------------------+
|                3 |
+------------------+
1 row in set (0.01 sec)
root@rac3 [yangyi]> insert into t1 values(null,'sss'),(null,'dd'),(null,'aaa');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0
root@rac3 [yangyi]> select * from t1;
+----+------+
| id | col  |
+----+------+
|  1 | sss  |
|  2 | sss  |
|  3 | sss  |
|  4 | sss  |
|  5 | dd   |
|  6 | aaa  |
+----+------+
6 rows in set (0.00 sec)

root@rac3 [yangyi]> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
|                4 |
+------------------+
1 row in set (0.00 sec)

last_insert_id 是与表无关的,如果向表a插入数据后,再向表b插入数据,last_insert_id 返回表b的Id值!
root@rac3 [yangyi]> insert into t2 values(null,'sss');
Query OK, 1 row affected (0.00 sec)
root@rac3 [yangyi]> select last_insert_id();         
+------------------+
| last_insert_id() |
+------------------+
|               11 |
+------------------+
1 row in set (0.00 sec)
root@rac3 [yangyi]> insert into t1 values(null,'sss');
Query OK, 1 row affected (0.00 sec)
root@rac3 [yangyi]> select @@identity;               
+------------+
| @@identity |
+------------+
|          3 |
+------------+
1 row in set (0.00 sec)

二 使用@@identity

@@identity是表示的是最近一次向具有identity属性(即自增列)的表插入数据时对应的自增列的值,是系统定义的全局变量。
其特性last_insert_id 一样.

三 使用max(id)

 
select max(id) from tab; 返回的是tab 的最大id值。
  使用max(id) 只能针对单个表获取最大的id,而且高并发情况下,必须加上'X' 锁才能获取会话当前的最大id,显然加锁会严重影响并发性能。


四 查看表结构

root@rac3 [yangyi]> show table  status like 't3' \G
*************************** 1. row ***************************
           Name: t3
         Engine: InnoDB
        Version: 10
     Row_format: Compact
           Rows: 2
Avg_row_length: 8192
    Data_length: 16384
Max_data_length: 0
   Index_length: 0
      Data_free: 0
Auto_increment: 3
    Create_time: 2014-05-06 20:36:00
    Update_time: NULL
     Check_time: NULL
      Collation: utf8_bin
       Checksum: NULL
Create_options:
        Comment:
1 row in set (0.00 sec)

root@rac3 [yangyi]> show create table t3 \G                    
*************************** 1. row ***************************
       Table: t3
Create Table: CREATE TABLE `t3` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `col` varchar(10) COLLATE utf8_bin DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_bin
1 row in set (0.00 sec)

五 总结
    我们知道MySQL 使用auto_increment 属性来实现自增id,这点与oracle 的sequence 不同,auto_increment 是基于表的而非全局。从oracle 到mysql 的dba 要注意改变对sequence 使用方式的转变。
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
9天前
|
存储 关系型数据库 MySQL
MySQL 8.0特性-自增变量的持久化
【11月更文挑战第8天】在 MySQL 8.0 之前,自增变量(`AUTO_INCREMENT`)的行为在服务器重启后可能会发生变化,导致意外结果。MySQL 8.0 引入了自增变量的持久化特性,将其信息存储在数据字典中,确保重启后的一致性。这提高了开发和管理的稳定性,减少了主键冲突和数据不一致的风险。默认情况下,MySQL 8.0 启用了这一特性,但在升级时需注意行为变化。
|
20天前
|
NoSQL 关系型数据库 MySQL
2024Mysql And Redis基础与进阶操作系列(4-2)作者——LJS[含MySQL非空、唯一性、PRIMARY KEY、自增列/自增约束举例说明等详解步骤及常见报错问题对应的解决方法]
24MySQL非空、唯一性、PRIMARY KEY、自增列/自增约束举例说明等详解步骤及常见报错问题对应的解决方法(4-2) 学不会你来砍我!!!
|
3月前
|
关系型数据库 MySQL
MySQL自增ID用完会怎样?
MySQL自增ID用完会怎样?
|
10天前
|
监控 关系型数据库 MySQL
MySQL自增ID耗尽应对策略:技术解决方案全解析
在数据库管理中,MySQL的自增ID(AUTO_INCREMENT)属性为表中的每一行提供了一个唯一的标识符。然而,当自增ID达到其最大值时,如何处理这一情况成为了数据库管理员和开发者必须面对的问题。本文将探讨MySQL自增ID耗尽的原因、影响以及有效的应对策略。
32 3
|
10天前
|
存储 监控 关系型数据库
MySQL自增ID耗尽解决方案:应对策略与实践技巧
在MySQL数据库中,自增ID(AUTO_INCREMENT)是一种特殊的属性,用于自动为新插入的行生成唯一的标识符。然而,当自增ID达到其最大值时,会发生什么?又该如何解决?本文将探讨MySQL自增ID耗尽的问题,并提供一些实用的解决方案。
17 1
|
1月前
|
SQL 关系型数据库 MySQL
MySQL设置表自增步长
MySQL设置表自增步长
81 0
|
5月前
|
SQL 关系型数据库 MySQL
字节面试:MySQL自增ID用完会怎样?
字节面试:MySQL自增ID用完会怎样?
71 0
字节面试:MySQL自增ID用完会怎样?
|
4月前
|
关系型数据库 MySQL 数据库
mysql,归零,无法自动排序,删除id,表单的数据没有从零开始出现怎样解决?删除数据仍然从删除的地方该怎样解决?表单的数据没有从2开始,而是从之前的删除的序号开始自增。
mysql,归零,无法自动排序,删除id,表单的数据没有从零开始出现怎样解决?删除数据仍然从删除的地方该怎样解决?表单的数据没有从2开始,而是从之前的删除的序号开始自增。
|
9天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
25 1
|
12天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
27 4