文档章节

mysql中的LAST_INSERT_ID()分析

赵开锦
 赵开锦
发布于 2012/06/21 17:52
字数 515
阅读 3576
收藏 10

今天跟人讨论php高并发下的LAST_INSERT_ID的正确性问题,一开始大家都比较模糊,后来经过大家共同查询资料,对这个问题有了比较清晰的了解,特发此文,以为纪念。

首先看mysql中的LAST_INSERT_ID()的官方说法:
LAST_INSERT_ID()自动返回最后一个INSERT或UPDATE查询中AUTO_INCREMENT列设置的第一个表发生的值。
MySQL
的LAST_INSERT_ID的注意事项:
第一、查询和插入所使用的Connection对象必须是同一个才可以,否则返回值是不可预料的。
第二
、LAST_INSERT_ID是与表无关的,如果向表a插入数据后再向表b插入数据,LAST_INSERT_ID返回表b的Id值。
第三
、假如你使用一条INSERT语句插入多个行,  LAST_INSERT_ID() 只返回插入的第一行数据时产生的值。
第四
、假如你使用 INSERT IGNORE而记录被忽略,则AUTO_INCREMENT 计数器不会增量,而 LAST_INSERT_ID() 返回0, 这反映出没有插入任何记录。

根据这四条原则,我们讨论的高并发网站访问时的插入后取自增长值其实主要是跟第一条规则和第二条规则有关。即要保证LAST_INSERT_ID的正确性,必须同一个connection,并且LAST_INSERT_ID要紧跟在insert中执行。所以如果是数据库缓存池公用connection可能会出问题,多线程操作在insert后面由执行了别的insert时也会出问题。

而php的数据库连接本身是页面级的,这样就保证了不会出现缓冲池的情况,然后php页面执行本身也是单线程的,这样就保证了顺序编写的LAST_INSERT_ID肯定是紧跟在insert之后执行的,中间不会有别的insert执行。

综上所述,php的页面级、单线程其实已经保证了mysql的LAST_INSERT_ID天然就是正确的,跟高并发并没有关系。即php中,mysql的LAST_INSERT_ID总是正确的,随便用把,没有问题的。

© 著作权归作者所有

赵开锦

赵开锦

粉丝 13
博文 25
码字总数 14499
作品 0
闸北
程序员
私信 提问
加载中

评论(6)

1531430343
1531430343
php设置PDO::ATTR_PERSISTENT持久连接情况下,mysql的last_insert_id也是完全可以的。持久连接的原理在于从连接池取出一个连接,连接用完了就返回池子,也就是说在你不管你是否使用连接池,通过mysql的last_insert_id得到的都是当前连接所产生的id。
成都福哥
成都福哥
这个貌似很有用。。不知三楼何出此言?????有什么心得分享一下?
简单代码
简单代码
我测试持久连接并不影响数据的获取,你可以测试一下。
http://my.oschina.net/u/140935/blog/131893
mark35
mark35
贻害无穷的LAST_INSERT_ID
Macrotea
Macrotea
受教了。
Vian
Vian
看到标题的时候感觉心里顿时凉了半截,看完了就又热了~ 哈哈,感谢分享~
MySQL · 源码分析 · 一条insert语句的执行过程

本文只分析了insert语句执行的主路径,和路径上部分关键函数,很多细节没有深入,留给读者继续分析 create table t1(id int); insert into t1 values(1) 略过建立连接,从 mysql_parse() 开始...

阿里云RDS-数据库内核组
2017/09/09
0
0
php 获取最后插入数据的id

向mysql 插入数据时 很多时候 我们想知 道刚刚插入数据的id 这对我们很有用 下面我说出常用的三种 方法并一一分析其利与弊 一 用以下语句: mysql_query("select max(id) from t1",$link); 使...

武当剑客
2014/10/27
4.2K
0
auto_increment的基本特性

MySQL的中AUTOINCREMENT类型的属性用于为一个表中记录自动生成ID功能,可在一定程度上代替Oracle,PostgreSQL等数据库中的sequence。 在数据库应用,我们经常要用到唯一编号,以标识记录。在...

真爱2015
2015/12/09
26
0
对MySQL load data infile的一点想法

今天无意和同事讨论MySQL load data infile的问题,这个问题是由开发那边引起的:他们竟然对一个4千万行的数据直接load data infile插入测试库,结果可想而知,出问题了。跑了一整晚都没跑完...

长平狐
2012/11/01
601
0
mysql锁技术讨论

mysql 常见锁问题分析 1 参考资料 - The InnoDB Transaction Mode and Locking-官方文档- MySQL 加锁处理分析- Innodb中的事务隔离级别和锁的关系 2 要明确的概念 - 不可重复读和幻读的区别-...

乒乓狂魔
2016/02/23
733
0

没有更多内容

加载失败,请刷新页面

加载更多

Hibernate 5 的模块/包(modules/artifacts)

Hibernate 的功能被拆分成一系列的模块/包(modules/artifacts),其目的是为了对依赖进行独立(模块化)。 模块名称 说明 hibernate-core 这个是 Hibernate 的主要(main (core))模块。定义...

honeymoose
44分钟前
4
0
CSS--属性

一、溢出 当内容多,元素区域小的时候,就会产生溢出效果,默认是纵向溢出 横向溢出:在内容和容器之间再套一层容器,并且内部容器要比外部容器宽 属性:overflow/overflow-x/overflow-y 取值...

wytao1995
今天
4
0
精华帖

第一章 jQuery简介 jQuery是一个JavaScript库 jQuery具备简洁的语法和跨平台的兼容性 简化了JavaScript的操作。 在页面中引入jQuery jQuery是一个JavaScript脚本库,不需要特别的安装,只需要...

流川偑
今天
7
0
语音对话英语翻译在线翻译成中文哪个方法好用

想要进行将中文翻译成英文,或者将英文翻译成中文的操作,其实有一个非常简单的工具就能够帮助完成将语音进行翻译转换的软件。 在应用市场或者百度手机助手等各大应用渠道里面就能够找到一款...

401恶户
今天
3
0
jenkins 插件下载加速最终方案

推荐做法 1、告诉jenkins 我哪些插件需要更新 jenkins插件清华大学镜像地址 https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json 1.进入jenkins系统管理 2.进入插件管...

vasks
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部