AUTO_INCREMENT和LAST_INSERT_ID

时间:2013-02-12 07:48:11

标签: mysql

我正在使用AUTO_INCREMENT,我想获取插入行的ID,以便我可以使用ID更新另一个表作为2个表之间的公共字段。

我了解LAST_INSERT_ID将获得最后ID。但是,我担心的是,许多用户同时访问数据库。因此,可能有另一个进程访问该表并同时插入一个新行。

LAST_INSERT_ID是否仅返回最后一个ID,无论使用何种连接,还是只返回我正在使用的连接的最后一个ID?

注意,我正在使用tomcat服务器中的连接池访问mySql数据库。

编辑:在夏天,我需要在表A中插入一行自动增量,而不是我需要在表B中插入行,需要使用自动增量值链接到表A.

4 个答案:

答案 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。 只要您不在当前连接中插入多个条目,它就是有效的。

此处提供更多信息:https://dba.stackexchange.com/questions/21181/is-mysqls-last-insert-id-function-guaranteed-to-be-correct

(我会链接到mysql.com,但它目前正在关注我)