我正在使用AUTO_INCREMENT
,我想获取插入行的ID,以便我可以使用ID
更新另一个表作为2个表之间的公共字段。
我了解LAST_INSERT_ID
将获得最后ID
。但是,我担心的是,许多用户同时访问数据库。因此,可能有另一个进程访问该表并同时插入一个新行。
LAST_INSERT_ID
是否仅返回最后一个ID,无论使用何种连接,还是只返回我正在使用的连接的最后一个ID?
注意,我正在使用tomcat服务器中的连接池访问mySql数据库。
编辑:在夏天,我需要在表A中插入一行自动增量,而不是我需要在表B中插入行,需要使用自动增量值链接到表A.
答案 0 :(得分:13)
SELECT max(employeeid) FROM Employee;
上面的查询返回Employee表中最后插入记录的employeeid值,因为employeeid是一个自动增量列。这似乎没问题,但假设两个线程同时执行插入操作,有可能你得到错误的最后插入记录的id!不用担心,MySQL提供了一个函数,它返回最后插入记录的自动增量列的值。
SELECT LAST_INSERT_ID();
LAST_INSERT_ID()始终是特定于连接的,这意味着即使从不同的连接同时执行插入操作,它也始终返回当前连接特定操作的值。所以你必须先在Employee表中插入记录,运行上面的查询来获取id值并使用它来插入第二个表
答案 1 :(得分:2)
LAST_INSERT_ID()
在上下文中工作,它应该在事务中或在用户定义的存储过程或用户定义的函数中。
答案 2 :(得分:2)
LAST_INSERT_ID
是特定于连接的。这是真的,但是如果你使用连接池,你应该小心。当您在循环中执行连续的INSERT IGNORE
语句并且池在每次迭代时为您提供相同的连接时,这可能会有问题。
例如;假设您为以下各项接收相同(开放)连接:
INSERT IGNORE ... some-new-id
>>> LAST_INSERT_ID
返回100
INSERT IGNORE ... some-existing-id
>>> LAST_INSERT_ID
仍会返回100
(上一个操作的结果)
在调用INSERT
之前,检查LAST_INSERT_ID
操作是否实际上插入了任何行总是好的。
答案 3 :(得分:1)
LAST_INSERT_ID
返回当前会话的最后一个插入ID。
只要您不在当前连接中插入多个条目,它就是有效的。
(我会链接到mysql.com,但它目前正在关注我)