免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 8606 | 回复: 10
打印 上一主题 下一主题

Mysql last insert id的疑问 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-04-28 20:46 |只看该作者 |倒序浏览
pdo->lastInsertId(),能保证是我这个连接调用insert语句后的inserId不?

还有一个疑问,对于 insert () values () , () ,() 这样的语句,我用lastInsertId-2,lastInsertId-1这样的方法准确得到前面插入的id不?

论坛徽章:
0
2 [报告]
发表于 2011-04-29 10:47 |只看该作者
大神呢?求正解

对于myisam,我觉得应该是可以这样获得的,对于insert(),(),()这样的语句应该是一次完成的,就是说应该是原子操作(说原子可能不大合适,找不到其他词),在insert的时候是锁表的,所以不可能中间发生其他insert,就是说这个insert id应该是连续的?

但是对于innodb,还真不能肯定,因为试过在insert(),(),()的时候中间出现问题的话,在这条有问题的数据之前其他的都已经插入了(没用事务的情况下)

论坛徽章:
1
数据库技术版块每日发帖之星
日期:2016-03-12 06:20:00
3 [报告]
发表于 2011-04-29 12:17 |只看该作者
InnoDB的话可以看《MySQL技术内幕:InnoDB存储引擎》
里面对自增长介绍的很清楚

论坛徽章:
0
4 [报告]
发表于 2011-04-29 12:26 |只看该作者
InnoDB的话可以看《MySQL技术内幕:InnoDB存储引擎》
里面对自增长介绍的很清楚
qlks 发表于 2011-04-29 12:17



    书有幸倒是看了,innodb在insert的时候,会先调用一个getmaxid之类的方法获取插入主键id,但是对于一次insert多个的话,。。。可能读得不够细{:3_191:}
    另外,这个能说下不,
pdo->lastInsertId(),能保证是我这个连接调用insert语句后的inserId不?

论坛徽章:
27
CU大牛徽章
日期:2013-03-13 15:15:08CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-09-18 15:24:09CU大牛徽章
日期:2013-09-18 15:24:20CU大牛徽章
日期:2013-09-18 15:24:25CU大牛徽章
日期:2013-09-18 15:24:31CU大牛徽章
日期:2013-09-18 15:24:36CU大牛徽章
日期:2013-09-18 15:24:41CU大牛徽章
日期:2013-09-18 15:24:48CU大牛徽章
日期:2013-09-18 15:24:52处女座
日期:2013-09-27 17:45:43
5 [报告]
发表于 2011-04-30 18:41 |只看该作者
我觉得是可以保证的,只要是在同一个连接里

论坛徽章:
0
6 [报告]
发表于 2011-04-30 19:09 |只看该作者
我觉得是可以保证的,只要是在同一个连接里
yifangyou 发表于 2011-04-30 18:41



    关键这个用短连接和长连接都不能保证它是同一个连接吧,服务器在这中间要销毁你和保留你得由它决定.

论坛徽章:
27
CU大牛徽章
日期:2013-03-13 15:15:08CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-09-18 15:24:09CU大牛徽章
日期:2013-09-18 15:24:20CU大牛徽章
日期:2013-09-18 15:24:25CU大牛徽章
日期:2013-09-18 15:24:31CU大牛徽章
日期:2013-09-18 15:24:36CU大牛徽章
日期:2013-09-18 15:24:41CU大牛徽章
日期:2013-09-18 15:24:48CU大牛徽章
日期:2013-09-18 15:24:52处女座
日期:2013-09-27 17:45:43
7 [报告]
发表于 2011-04-30 19:17 |只看该作者
回复 6# starzhestarzhe
什么语言啊,若是不能保证那么意义啊
pdo->lastInsertId()这个函数就没有意义了;

若是连接断了pdo->lastInsertId()应该会出错才对

论坛徽章:
27
CU大牛徽章
日期:2013-03-13 15:15:08CU大牛徽章
日期:2013-05-20 10:46:38CU大牛徽章
日期:2013-05-20 10:46:44CU大牛徽章
日期:2013-09-18 15:24:09CU大牛徽章
日期:2013-09-18 15:24:20CU大牛徽章
日期:2013-09-18 15:24:25CU大牛徽章
日期:2013-09-18 15:24:31CU大牛徽章
日期:2013-09-18 15:24:36CU大牛徽章
日期:2013-09-18 15:24:41CU大牛徽章
日期:2013-09-18 15:24:48CU大牛徽章
日期:2013-09-18 15:24:52处女座
日期:2013-09-27 17:45:43
8 [报告]
发表于 2011-04-30 19:19 |只看该作者
对于 insert () values () , () ,() 这样的语句,我用lastInsertId-2,lastInsertId-1这样的方法准确得到前面插入的id不?
答:这个若是在事物里,可以保证,若是不是那就很难说了。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:58:11
9 [报告]
发表于 2011-05-01 07:50 |只看该作者
我查看了相关资料,pdo->lastInsertId并不能保证是insert语句后的inserId,mysql_insert_id() 也不可。若是mysql数据库,可以不用php的,用MySQL 中的 SQL 函数 LAST_INSERT_ID(),或是mysql_insert_id()。
LAST_INSERT_ID():
1. 产生的ID 每次连接后保存在服务器中。这意味着函数向一个给定客户端返回的值是该客户端产生对影响AUTO_INCREMENT列的最新语句第一个 AUTO_INCREMENT值的。这个值不能被其它客户端影响,即使它们产生它们自己的 AUTO_INCREMENT值。这个行为保证了你能够找回自己的 ID 而不用担心其它客户端的活动,而且不需要加锁或处理。
2.假如你使用单INSERT语句插入多个行,  LAST_INSERT_ID() 只返回插入的第一行产生的值。其原因是这使依靠其它服务器复制同样的 INSERT语句变得简单。

论坛徽章:
0
10 [报告]
发表于 2011-05-01 11:17 |只看该作者
回复  starzhestarzhe
什么语言啊,若是不能保证那么意义啊
pdo->lastInsertId()这个函数就没有意义了; ...
yifangyou 发表于 2011-04-30 19:17



    这不是语言的问题,这种场景是不能排除的,服务器并发很大,连接池塞满...现在一些语言的mysql api在执行一个query之前都会事先判断这个连接资源,如果没有就会重新连一次\
我很奇怪为啥在执行insert这个语句返回的时候带上这个insert id呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP