在关系型数据库的表结构中,一般情况下,都会定义一个具有‘AUTO_INCREMENT’扩展属性的‘ID’字段,以确保数据表的每一条记录都有一个唯一标识。

  而实际应用中,获取到最近最大的ID值是必修课之一,针对于该问题,实践整理如下:

  

1、新建测试数据表get_max_id

 mysql>CREATETABLE `get_max_id` (
   `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '业务主键',
`content` char(25) DEFAULT NULL COMMENT '业务内容',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

2、未初始化表获取最大自增ID

  创建完数据表之后,我们知道,表中的内容暂时为空,此时,查询max(id)获取到的内容将是NULL;

  方式1 - max(id):

    该方式的优点是简单粗暴,直奔菊花,啊不是( ̄m ̄),直奔主题;

    同时,它无视其它客户端连接(db_connection)的影响,可以直奔第3点位置;

mysql>select max(id) from get_max_id;
+---------+
| max(id) |
+---------+
| NULL |
+---------+
1 row in set (0.00 sec)

  

  方式2 - LAST_INSERT_ID()函数:

    LAST_INERT_ID(),返回最后一个INSERT或 UPDATE 查询中, AUTO_INCREMENT列设置的第一个表的值。

    这玩意儿的使用还是有些限制的:

     1、同一个Connection连接对象(同一客户端)中,SELECT的结果为最后一次INSERT的AUTO_INCREMENT属性列的ID。这句话的重点在于“同一个”,即其他连接的客户端不对其查询的结果造成影响。假设客户端A和B,表ta原自增ID为3,在A中插入记录后产生自增ID为4,在客户端A中通过该函数查询的结果为4,但在客户端B中查询的结果值仍为3;(已验证)

     2、与表无关,即假设ta表和tb表,向ta插入记录后,再向tb插入记录,结果值为tb的max(id)值;(已验证)

     3、使用非魔术方法('magic')来INSERT或UPDATE一条记录时,即使用非0/非NULL值作为插入的字段,则LAST_INSERT_ID()返回值不会发生变化;(已验证)

     4、同一条INSERT语句中,传入多个VALUES值,则LAST_INSERT_ID()返回值为该查询第一条记录的ID;(已验证)

        5、在进阶方面,可运用作分表ID的唯一性。

    初始化查询的结果,得到的是0,这点和max(id)还是有区别的;

mysql>select LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 0 |
+------------------+
1 row in set (0.00 sec)

  

  方式3 - 查看表状态show table status

    该方式提供了当前DB(use db_name;)下每个表的基本信息;可以通过where条件获取到Auto_increment属性的值;

    下述提供的结果值,为下一个自增ID的数值。

mysql> show table status where Name='get_max_id';
+------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time | Update_time | Check_time | Collation | Checksum | Create_options| Comment |
+------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| get_max_id | InnoDB | 10 | Compact | 0 | 0 | 16384 | 0 | 0 | 10485760 | 1 | 2015-04-20 11:49:07 | NULL | NULL | utf8_general_ci | NULL | | |
+------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
1 row in set (0.00 sec)

  

  方式4 - information_schema.tables

    提供关于数据库中的表(包括视图)的信息。详细描述了某个表属于哪个schema,表类型,表引擎等等信息;

    下述提供的结果值,为下一个自增ID的数值。

mysql> select table_name, AUTO_INCREMENT from information_schema.tables where table_name="get_max_id";
+------------+----------------+
| table_name | AUTO_INCREMENT |
+------------+----------------+
| get_max_id | 1 |
+------------+----------------+
1 row in set (0.01 sec)

  方式5 - @@IDENTITY全局变量

    基础:以@@开头的变量为全局变量,而以@开头的变量为用户自定义的变量。

    此处 @@IDENTITY表示最近一次向具有identity属性(auto_increment)的表INSERT数据时对应的自增列的值。此处得到的值是0。

    1、类似于LAST_INSERT_ID()函数,该方式必须在同一个客户端内进行的INSERT与SELECT,且不受其他客户端影响;(已验证)

    2、与表无关;(已验证)

    3、非魔术方法插入不影响结果值;(已验证)

    4、同一INSERT插入多条记录,取第一条记录的ID值为结果;(已验证)

mysql> select @@IDENTITY;
+------------+
| @@IDENTITY |
+------------+
| 0 |
+------------+
1 row in set (0.00 sec)

转载来源: http://www.cnblogs.com/w3chen/p/4441512.html

Mysql获取最大自增ID(auto_increment)的五种方式及其特点的更多相关文章

  1. mysql 获取刚插入行id汇总

    mysql 获取刚插入行id汇总 我们在写数据库程序的时候,经常会需要获取某个表中的最大序号数, 一般情况下获取刚插入的数据的id,使用select max(id) from table 是可以的.但 ...

  2. Mysql查看版本号的五种方式介绍

    Mysql查看版本号的五种方式介绍 作者: 字体:[增加 减小] 类型:转载 时间:2013-05-03   一.使用命令行模式进入mysql会看到最开始的提示符;二.命令行中使用status可以看到 ...

  3. Android自动化测试中AccessibilityService获取控件信息(2)-三种方式对比

    Android自动化测试中AccessibilityService获取控件信息(2)-三种方式对比   上一篇文章: Android自动化测试中AccessibilityService获取控件信息(1 ...

  4. [Mysql]查看版本号的五种方式

    [Mysql]查看版本号的五种方式   目录(?)[+]   查看版本信息 #1 使用命令行模式进入mysql会看到最开始的提示符 Your MySQL connection id is 3Serve ...

  5. MySQL查看版本号的五种方式介绍1111111

    MySQL查看版本号的五种方式介绍 1 命令行模式登录MySQL [root@localhost ~]# mysql -uroot -p Enter password: Welcome to the ...

  6. struts2获取request、session、application的四种方式

    struts2获取request.session.application的四种方式 //获取map类型的request.session.application public class LoginAc ...

  7. Springboot 创建的maven获取resource资源下的文件的两种方式

    Springboot 创建的maven项目 打包后获取resource下的资源文件的两种方式: 资源目录: resources/config/wordFileXml/wordFileRecord.xm ...

  8. mysql如何让自增id从1开始设置方法

    有两种方式 第一种: 如果表中数据没有用.如果直接删除数据,自动增长ID还是不会从1开始的,可以利用“清空数据表”.这样自动增长ID也将会从1开始. 清空表的sql如下 truncate table ...

  9. Spring boot jpa 设定MySQL数据库的自增ID主键值

    内容简介 本文主要介绍在使用jpa向数据库添加数据时,如果表中主键为自增ID,对应实体类的设定方法. 实现步骤 只需要在自增主键上添加@GeneratedValue注解就可以实现自增,如下图: 关键代 ...

随机推荐

  1. 潭州课堂25班:Ph201805201 django 项目 第四十四课 项目部署 (课堂笔记)

    项目部署 稳定,并发,效益, 一.Django配置 1.settings.py配置 复制全局settings.py配置文件,创建一个副本命名为MyBlog/pro_settings.py,修改DEBU ...

  2. java多态的向上转型与向下转型(与编译时类型与运行时类型有关)

    1.编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定. 当编译时类型和运行时类型不一致时,就会出现所谓的多态. 因为子类是一个特殊的父类,因此java允许把一个子类对象直接 ...

  3. Shuffle 洗牌 [AHOI 2005]

    Description 为了表彰小联为 Samuel 星球的探险所做出的贡献,小联被邀请参加 Samuel 星球近距离载人探险活动. 由于 Samuel 星球相当遥远,科学家们要在飞船中度过相当长的一 ...

  4. phpExcel导入大数据量情况下内存溢出解决方案

    PHPExcel版本:1.7.6+ 在不进行特殊设置的情况下,phpExcel将读取的单元格信息保存在内存中,我们可以通过 PHPExcel_Settings::setCacheStorageMeth ...

  5. 我要当皇帝等微信小游戏的wbs

    猜字:1.视图交互: 1)主界面:展示每一道题目跟答案 1) 题目展示区域, 成员布局 2) 选项展示 3) 其他 2)下一道题弹框 3)答案弹框 4)结果弹框 5)关卡弹框 2.数据处理, 1) 读 ...

  6. 唐平中讲座笔记 Reinforcement mechanism design 20171107

    渣排版预警,纯草稿... 唐平中.研究方向是经济学和ai方向,机制设计和拍卖设计. 内容:广告优化的方法论,自动优化. [内容] Basics on mechanism design and resr ...

  7. ftp修改上传后目录、文件权限问题 aix

    问题:在AIX操作系统中,用root用户ftp文件到AIX上后,文件的默认权限是rw-r-----,Oracle用户无法读取.有没有办法指定上传文件的权限呢? 环境: AIX 6.1 解决方法: 1. ...

  8. Zepto tap 穿透bug、解决移动端点击穿透问题

    当两个层重叠在一起时,或是有个弹窗,使用Zepto的tap事件时,点击上面的一层时会触发下面一层的事件,特别是底层如果是input框时,必“穿 透”,“google”说原因是“tap事件实际上是在冒泡 ...

  9. [原创]AndroBugs_Framework Android漏洞扫描器介绍

    [原创]AndroBugs_Framework Android漏洞扫描器介绍 1 AndroBugs_Framework Android 漏洞扫描器简介 一款高效的Android漏洞扫描器,可以帮助开 ...

  10. CSS中margin边界叠加问题及解决方案

    你对CSS的margin边界叠加的概念是否了解,这里和大家分享一下,当一个元素出现在另一个元素上面时,第一个元素的底边界与第二个元素的顶边界发生叠加. CSS的margin边界叠加深度剖析 边界叠加简 ...