博客
关于我
MySql LAST_INSERT_ID 【插入多条数据时】
阅读量:802 次
发布时间:2023-02-10

本文共 1121 字,大约阅读时间需要 3 分钟。

LAST_INSERT_ID

LAST_INSERT_ID 是 MySQL 中一个重要的函数,用于返回数据库中 AUTO_INCREMENT 列在最后一次 INSERT 或 UPDATE 操作中生成的第一个记录的 ID。

这一函数的值是基于每个连接独立维护的,这意味着每个客户端连接都有自己的 LAST_INSERT_ID 值,不会受到其他连接的影响。通过使用 SELECT LAST_INSERT_ID() 可以直接查询到当前连接的最新生成 ID。

需要注意的是,当使用单次的 INSERT 语句插入多条记录时,LAST_INSERT_ID() 只会返回插入的第一条记录的 ID。例如:

  1. mysql> INSERT INTO t VALUES (NULL, 'aaaa'), (NULL, 'bbbb'), (NULL, 'cccc');
  2. mysql> SELECT * FROM t;
  3. +----+------+  
  4. | id | name |   
  5. +----+------+  
  6. |  1 | Bob  |   
  7. |  2 | aaaa |   
  8. |  3 | bbbb |   
  9. |  4 | cccc |   
  10. +----+------+  
  11. mysql> SELECT LAST_INSERT_ID();
  12. +------------------+  
  13. | LAST_INSERT_ID() |   
  14. +------------------+ 
  15. |  2 |   
  16. 在上述示例中,LAST_INSERT_ID() 返回的值是 2,这是因为 2 是插入第一条记录 'aaaa' 时生成的 ID。

    需要注意的是,LAST_INSERT_ID() 与表无关。即使你先向表 a 插入数据,再向表 b 插入数据,LAST_INSERT_ID() 也会发生改变。这意味着它是基于当前连接最近的操作来返回值的。

    在多线程环境中,如果每个线程都使用独立的连接对象,那么LAST_INSERT_ID() 是一个非常有力的工具。它能够保证每个连接返回自己插入的最新 ID,而不需要额外的锁,避免了竞争条件的问题。

    虽然理论上可以通过 SELECT max(id) 从表中查询最新的 ID,但这种方法在多用户环境下是不可行的。因为当多个用户同时插入数据时,max(id) 可能会返回其他用户的 ID,从而导致数据不一致的问题。而 LAST_INSERT_ID() 基于连接的特性,能够保证每个连接都能正确获取自己插入的数据的 ID。

    综上所述,LAST_INSERT_ID() 是一个非常实用的工具,特别是在需要确保数据唯一性和一致性的场景中。它不仅能够简化代码,还能提高系统的性能和可靠性。

    转载地址:[原文链接已被处理]

你可能感兴趣的文章
No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalanc
查看>>
No mapping found for HTTP request with URI [/...] in DispatcherServlet with name ...的解决方法
查看>>
No mapping found for HTTP request with URI [/logout.do] in DispatcherServlet with name 'springmvc'
查看>>
No module named 'crispy_forms'等使用pycharm开发
查看>>
No module named 'pandads'
查看>>
No module named cv2
查看>>
No module named tensorboard.main在安装tensorboardX的时候遇到的问题
查看>>
No module named ‘MySQLdb‘错误解决No module named ‘MySQLdb‘错误解决
查看>>
No new migrations found. Your system is up-to-date.
查看>>
No qualifying bean of type XXX found for dependency XXX.
查看>>
No qualifying bean of type ‘com.netflix.discovery.AbstractDiscoveryClientOptionalArgs<?>‘ available
查看>>
No resource identifier found for attribute 'srcCompat' in package的解决办法
查看>>
no session found for current thread
查看>>
No static resource favicon.ico.
查看>>
no such file or directory AndroidManifest.xml
查看>>
No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android
查看>>
NO.23 ZenTaoPHP目录结构
查看>>
no1
查看>>
NO32 网络层次及OSI7层模型--TCP三次握手四次断开--子网划分
查看>>
NOAA(美国海洋和大气管理局)气象数据获取与POI点数据获取
查看>>