12

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

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

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

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

总之,我需要在表 A 中插入一行并自动递增,而不是在表 B 中插入行,这需要使用该AUTO_INCREMENT值链接到表 A。

4

4 回答 4

18
SELECT max(employeeid) FROM Employee;

上面的查询返回employeeidEmployee 表中最后插入的记录的值,因为employeeid它是一个自增列。这似乎没问题,但是假设两个线程同时执行插入操作,您可能会得到错误的最后插入记录的 id!

别担心,MySQL 提供了一个函数,它返回最后插入记录的自增列的值。

SELECT LAST_INSERT_ID();

LAST_INSERT_ID()始终是特定于连接的,这意味着即使从不同的连接同时执行插入操作,它也始终返回当前特定于连接的操作的值。

因此,您必须首先在 Employee 表中插入记录,运行上述查询以获取 id 值并使用它来插入第二个表。

于 2013-02-12T08:01:41.093 回答
2

LAST_INSERT_ID()上下文中工作,它应该在事务中或在用户定义的存储过程或用户定义的函数中。

于 2013-02-12T07:53:36.037 回答
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

于 2013-04-30T19:45:02.170 回答
1

LAST_INSERT_ID返回当前会话的最后一个插入 ID。只要您在当前连接中插入的条目不超过一个,它就有效。

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

(我会链接到 mysql.com,但它目前不适合我)

于 2013-02-12T07:51:01.997 回答