当前位置:首页 > 问答 > 正文

Mysql里那个Last_insert_id函数到底怎么用,语法和细节简单聊聊

这个函数是干嘛的?说白了,就是当你往一张有自增主键的表格里插入一条新数据后,你用这个函数能立刻查到你刚刚插入的那条数据的ID是多少,这个ID是MySQL自动为你生成的,你不需要自己指定,这个功能在日常开发中非常常用,比如你注册一个新用户,用户信息存进数据库后,你需要立刻拿到这个新用户的ID,然后可能要用这个ID去做其他操作,比如初始化他的个人资料表等等。

它的语法简单到不能再简单了:

SELECT LAST_INSERT_ID();

就这么写就行了,它不需要任何参数,括号里是空的,执行后它会返回一个数字,就是最后一次插入操作所产生的自增ID值。

接下来聊聊使用细节,这部分很重要,用错了会出问题:

  1. “最后一次”指的是什么? 这个“最后一次”有非常严格的限制,它指的是在当前数据库连接(connection)中,由当前客户端产生的最后一次自增ID,这句话有两个关键点:

    • 当前连接:如果你用A电脑的程序连接数据库,插入一条数据,然后立刻用B电脑的程序去执行LAST_INSERT_ID(),是拿不到A电脑插入的那个ID的,这个值是跟每个连接绑定的,MySQL官方手册(MySQL 8.0 Reference Manual)里明确说了,这个值是在每个连接的基础上在服务器中被维护的。
    • 由INSERT语句产生:只有通过类似INSERT INTO table_name ...这样的语句成功插入了数据,这个值才会被改变,你用UPDATE语句去改数据,或者用SELECT去查数据,都不会影响LAST_INSERT_ID()的结果。
  2. 一次插入多条数据会怎样? 这是个好问题,如果你用一个INSERT语句同时插入了多条记录,INSERT INTO user (name) VALUES ('张三'), ('李四'), ('王五');,那么LAST_INSERT_ID()会返回第一条记录的自增ID,也就是‘张三’的ID,假设原来最大的ID是100,那么执行后,‘张三’的ID是101,‘李四’是102,‘王五’是103,但LAST_INSERT_ID()只会返回101,MySQL手册里提到,这是为了在其他服务器上重现同一个INSERT语句时能保持正确性。

  3. 哪些情况会改变这个值? 基本上,只有成功的、能生成新自增ID的INSERT语句会改变它,但有个特殊情况,就是你可以手动设置它,比如你可以执行SELECT LAST_INSERT_ID(100);,这样你就强行把这个函数的值设置成了100,不过这个用法非常罕见,通常只在一些复制或者恢复数据的特殊场景下使用,平常自己写代码基本用不到,手册里也描述了这种用法,但提醒要谨慎使用。

  4. 如果插入失败了呢? 如果你的INSERT语句因为某些原因(比如数据重复、格式错误)执行失败了,没有成功插入任何数据,那么LAST_INSERT_ID()的值不会改变,它依然保持着上一次成功插入时的值。

  5. 事务会影响它吗? 事务的回滚(ROLLBACK)操作不会影响LAST_INSERT_ID()的值,举个例子,你开启一个事务,插入一条数据,ID变成了105,然后你因为某些原因回滚了事务,刚插入的105那条数据被撤销了。LAST_INSERT_ID()的值仍然会是105,等你下次再插入新数据时,自增ID会跳到106(因为105虽然逻辑上不存在了,但计数器已经增长了),而LAST_INSERT_ID()也会返回106。

  6. 在一条SQL语句里同时插入并获取ID:这是一种很常见的写法,特别是在程序代码里,你可以把插入和查询写在一起,确保万无一失。

    INSERT INTO orders (product_name, amount) VALUES ('手机', 2999);
    SELECT LAST_INSERT_ID() as new_order_id;

    在编程时,你可以在执行完插入语句后,立刻在同一个数据库连接里执行查询LAST_INSERT_ID()的语句,这样就能稳稳地拿到刚刚生成的订单ID。

使用LAST_INSERT_ID()的核心要点就是:

  • 时机:一定要在插入语句之后同一个数据库连接中马上使用。
  • 作用范围:它只对具有AUTO_INCREMENT属性的列有效。
  • 多行插入:注意多行插入时它只返回第一个ID。

这个函数的设计非常巧妙,它通过绑定到每个连接的方式,完美解决了在多用户同时操作数据库的环境下,不会互相干扰的问题,你永远不用担心别人插入了一条数据会把你刚刚拿到的ID给“冲掉”,只要你是在自己的连接里连续操作,就能准确无误地拿到属于自己的那个新ID。

希望这些大白话的解释能让你彻底明白这个函数该怎么用。

Mysql里那个Last_insert_id函数到底怎么用,语法和细节简单聊聊