首页 > 数据库 >mysql中last_insert_id()用法

mysql中last_insert_id()用法

时间:2024-04-19 21:34:06浏览次数:17  
标签:insert last name jdbcTemplate id stock

前言

在使用 MySQL 时,若表中含自增字段(auto_increment 类型),则向表中 insert 一条记录后,可以调用 last_insert_id() 来获得最近 insert 的那行记录的自增字段值。但事实上,使用 last_insert_id() 时有很多注意事项,很容易踩到坑。

数据准备

CREATE TABLE `tb_product` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` varchar(20) DEFAULT NULL COMMENT '商品名称',
  `stock` int DEFAULT NULL COMMENT '库存量',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=112 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

注意事项

事项一

last_insert_id() 的值是由 MySQL server 来维护的,而且是为每个连接维护独立的值,也就是说,某个连接调用 last_insert_id() 获取到的值是这个连接最近一次 insert 执行后的自增值,该值不会被其它连接所影响。这个行为保证了不同的连接能正确地获取到它最近一次 insert 执行所插入的行的自增值,也就是说,last_insert_id() 的值不需要通过加锁或事务机制来保证其在多连接场景下的正确性。

@PostMapping("testMysql3")
public Integer testMysql3(String name, int stock) {
    jdbcTemplate.update("insert into tb_product(name,stock) values(?,?)", name, stock);
    return jdbcTemplate.queryForObject("select last_insert_id()", Integer.class);
}

我们在 mysql 客户端如 阿里云dms 上是没办法得到正确的 last_insert_id() 返回值的,因为 insert 语句和 select 语句 是两个连接执行的。

事项二

若在 SQL 中显式指定自增字段的值,last_insert_id() 获取到的值为 0。也就是说,只有自增字段由 mysql 来分配时,last_insert_id() 才能得到正确的值,SQL中显式更新自增字段值时,last_insert_id() 返回的值不可用。

@PostMapping("testMysql4")
public Integer testMysql4(int id, String name, int stock) {
    jdbcTemplate.update("insert into tb_product(id,name,stock) values(?,?,?)", id, name, stock);
    return jdbcTemplate.queryForObject("select last_insert_id()", Integer.class); // 结果为0
}

事项三

若在同一条 insert 语句中插入多行,last_insert_id() 返回的值只是自增一次的值,这与实际情况不符(表中的实际情况是自增字段值在旧值基础上加N)。

@PostMapping("testMysql5")
public Integer testMysql5(String name, int stock) {
    jdbcTemplate.update("insert into tb_product(name,stock) values(?,?),(?,?),(?,?)", name, stock, name, stock, name, stock);
    return jdbcTemplate.queryForObject("select last_insert_id()", Integer.class);
}

事项四

若调用 last_insert_id() 时传入了参数,则它会将参数值返回给调用者,并记住这个值,下次调用不带参数的 last_insert_id() 时,仍会返回这个值。可以利用这个特性实现一个多用户安全的全局计数器。

@PostMapping("testMysql6")
public Integer testMysql6(int id, int stock) {
    jdbcTemplate.update("update tb_product set stock=last_insert_id(stock+?) where id=?", stock, id);
    return jdbcTemplate.queryForObject("select last_insert_id()", Integer.class);
}

假设 stock 原来为 10,在原来的基础上增加 10,接下来的 last_insert_id() 就返回 20。

参考

mysql LAST_INSERT_ID 使用与注意事项

标签:insert,last,name,jdbcTemplate,id,stock
From: https://www.cnblogs.com/strongmore/p/18110436

相关文章

  • RILIR 复现 & 一些 idea
    伪代码:在ifdone的时候,在环境中已经跑了一个trajectory了,利用当前的trajectory和专家的demo求一下reward(文章中用的是optimaltransport的几种方法)否则,就继续在observation的基础上利用actor学到的策略sample出action,并用list记录下当前的\((o_t,a_t,r_......
  • android studio jdk问题
    报错使用Terminal运行命令,报错:FAILURE:Buildfailedwithanexception.*Whatwentwrong:Aproblemoccurredconfiguringrootproject'StringFog'.>Couldnotresolveallfilesforconfiguration':classpath'.>Couldnotresolvec......
  • 对国内的人行机器人(humanoid)的一些技术类的提问?
    贵公司产品在机器人仿真时具体采用的仿真软件(NVIDIA家的、开源的webot,等等)是哪款,如果没有使用NVIDIA全家桶那么其原因是什么(如:技术依赖没有独立技术、技术栈太过于复杂暂时没有精力和能力使用)?贵公司的产品是否将足部的控制和灵巧手控制分开进行训练?贵公司在训练机器人时是......
  • Ubuntu 22.04 安装 Nvidia 驱动最方便安全的方式
    刚安装好的Ubuntu22.04没有N卡驱动,输入nvidia-smi,提示没有此程序并推荐到apt安装。但是,使用apt安装nvidia驱动会有极大概率出现启动黑屏和闪屏问题。不如进入开始菜单,找到“附加驱动”:此处展示了可用的Nvidia驱动,选择自己想要的版本安装,"tested"表明其经过测试,......
  • Elasticsearch 所有内置分析器介绍(5)
     Elasticsearch 附带了各种内置分析器,可以直接在任何索引中使用,而无需额外配置:1)标准分析器  StandardAnalyzer该分析器的文本分词规则是:过滤掉大多数标点符号来划分单词,通过Unicode文本分割算法,再转成小写的分词。支持删除常用的停用词(如:the,a......
  • mac intellij idea卡顿排查解决
    最近我的idea异常卡顿,一顿谷歌查找后,解决。如下1.调整idea的JVM内存 Help->EditcustomVMOptions-Xms2048m-Xmx2048m-XX:ReservedCodeCacheSize=512m-XX:+IgnoreUnrecognizedVMOptions-XX:+UseG1GC-XX:SoftRefLRUPolicyMSPerMB=50-XX:+UseStringDeduplication-XX:AutoBoxC......
  • IDEA中创建一个Servlet项目的详细步骤
    以下是通过IDEA创建一个简单的JavaServlet示例,支持通过HTTP在浏览器中访问的详细步骤。1.创建项目打开IDEA,点击NEW创建一个新项目生成如下的目录结构设置Maven的路径,File—>settings—>输入mvn。 2.引入依赖我们所使用的Servlet是Tomcat的api,不是JDK,也就是说Servlet......
  • taro 基础组件 video的一些基本情况设置
    <videoclass="section-video-content"id="myVideo"src="http://192.168.10.15:9000/sisterofdc/exam/video/226/test.mp4"@timeupdate='getUpdateTime'></video>function......
  • BOSHIDA DC电源模块的未来发展方向和创新应用领域
    BOSHIDADC电源模块的未来发展方向和创新应用领域随着科技的快速发展,直流(DC)电源模块的应用领域也在不断扩大。从传统的电子产品到新兴的清洁能源领域,DC电源模块正发挥着越来越重要的作用。未来,DC电源模块将继续发展,并在更多领域创造创新应用。 一,DC电源模块在电子产品中的应......
  • ioS 的ADB tidevice 同步某个应用的日志
    要使用tidevice工具实时同步某个应用的日志,可以按照以下步骤进行操作:安装tidevice(如果尚未安装)在命令行终端中,运行以下命令来安装tidevice:pip3install-Utidevice连接你的iOS设备使用USB线连接你的iOS设备到电脑上。配对设备(如果尚未配对)打开终端(在Wind......