2013-01-09 33 views
5

我有一张桌子,上面有一列AUTO INCREMENT。当插入一个新行时(我需要新行的值),我必须检索这个列的值。我读了很多关于它的信息,并找到了不同的解决方案,其中一个是使用SELECT LAST_INSERT_ID()。我听说过很多不同的事情。我可以或不可以使用这个吗?我担心另一个连接可能会插入一个新行,然后我才能拨打SELECT LAST_INSERT_ID(),并因此得到错误的ID。使用MYSQL LAST_INSERT_ID()来检索插入行的ID?

总结一下,使用SELECT LAST_INSERT_ID()安全吗?如果没有,我怎样才能以安全的方式检索最后插入的ID?

+0

最后插入的ID应该返回当前连接所产生的最后一个ID。无需担心其他连接。 –

+0

请参阅:http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id –

+2

如果您有自动连接池,运行另一个呼叫可能会在不同的连接。如果你没有这个,你是安全的。 –

回答

12

我不认为你需要担心你在这里提到的情况。

从MySQL文档:
已生成被保持在基于每个连接的基础上的服务器的ID。这意味着该函数返回给定客户端的值是该客户端最近一次影响AUTO_INCREMENT列的语句生成的第一个AUTO_INCREMENT值。此值不会受其他客户端的影响,即使它们生成自己的AUTO_INCREMENT值。此行为可确保每个客户端都可以检索自己的ID,而不必关心其他客户端的活动,而无需锁定或事务。

有关详细信息,请参阅this

虽然,我会很喜欢,如果他们有不同的意见,从他人阅读。

0

如果您需要拥有表格的最后一个ID至关重要,则可以锁定表格进行写入,然后制作SELECT MAX(id) FROM table_name,然后解锁表格。

0

生成的ID是基于每个连接的,因此您不应该有任何问题! This帖子更详细。

0

是,根据正式文件,它是安全的:

已生成的ID被保持在基于每个连接的基础服务器。这意味着该函数返回给定客户端的值是为该客户端影响AUTO_INCREMENT列的最新语句生成的第一个AUTO_INCREMENT值。即使它们生成自己的AUTO_INCREMENT值,该值也不会受到其他客户端的影响。此行为可确保每个客户端都可以检索自己的ID,而不必关心其他客户端的活动,而无需锁定或事务。

摘自:MYSQL Documentation 12.13. Information Functions

0

如果您使用PDO,使用PDO::lastInsertId.

,如果你正在使用MySQL,使用mysqli::$insert_id.

和是的,它是安全的使用AI这是这个帖子说这个: http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html

而不是使用seleclec牛逼的语句直接,尽量用preparedStatement.

你也可以使用Lock

相关问题