27.7.6.38 mysql_insert_id()

my_ulonglong mysql_insert_id(MYSQL *mysql)

Description

返回由上一个INSERTUPDATE语句为AUTO_INCREMENT列生成的值。在对包含AUTO_INCREMENT字段的 table 中执行INSERT语句或使用INSERTUPDATE设置LAST_INSERT_ID(expr)的列值之后,请使用此功能。

除非在以下条件之一下显式更新,否则mysql_insert_id()的返回值始终为零:

  • 将值存储在AUTO_INCREMENT列中的INSERT条语句。无论是通过将特殊值NULL0存储到列中来自动生成该值,还是为显式的非特殊值,都是如此。

  • 对于多行INSERT语句,mysql_insert_id()返回成功插入的第一个自动生成的AUTO_INCREMENT值。

如果没有成功插入任何行,则mysql_insert_id()返回 0.

mysql_insert_id()的返回值可以简化为以下 Sequences:

  • 如果存在AUTO_INCREMENT列,并且已成功插入自动生成的值,请返回第一个此类值。

  • 如果该语句中出现LAST_INSERT_ID(expr),则即使受影响的 table 中有AUTO_INCREMENT列,也应返回* expr *。

  • 返回值取决于所使用的语句。在INSERT语句后调用时:

  • 如果 table 中有一个AUTO_INCREMENT列,并且该列中有一些显式值已成功插入到 table 中,则返回最后一个显式值。

插入...在重复的密钥更新上语句后调用时:

  • 如果 table 中有一个AUTO_INCREMENT列,并且有一些显式成功插入的值或某些更新的值,则返回最后一个插入或更新的值。

如果前一条语句不使用AUTO_INCREMENT值,则mysql_insert_id()返回0。如果必须保存该值以备后用,请确保在生成该值的语句后立即调用mysql_insert_id()

mysql_insert_id()的值仅受当前 Client 端连接内发出的语句影响。它不受其他 Client 发布的声明的影响。

LAST_INSERT_ID() SQL 函数将包含成功插入的第一个自动生成的值的值。不会在语句之间重置LAST_INSERT_ID(),因为该函数的值在服务器中维护。与mysql_insert_id()的另一个区别是,如果将AUTO_INCREMENT列设置为特定的非特殊值,则不会更新LAST_INSERT_ID()。参见第 12.15 节“信息功能”

对于产生AUTO_INCREMENT值的存储过程,在CALL语句之后mysql_insert_id()返回0,因为在这种情况下mysql_insert_id()适用于CALL而不是过程中的该语句。在该过程中,可以在 SQL 级别上使用LAST_INSERT_ID()获得AUTO_INCREMENT值。

LAST_INSERT_ID()mysql_insert_id()之所以不同的原因是,LAST_INSERT_ID()易于在脚本中使用,而mysql_insert_id()试图提供有关AUTO_INCREMENT列发生了什么的更准确的信息。

Note

Client 端/服务器协议中使用的 OK 数据包保存信息,例如用于会话状态跟踪的信息。当 Client 端读取 OK 数据包以了解会话状态是否发生更改时,这将重置值,例如最后的插入 ID 和受影响的行数。此类更改会导致mysql_insert_id()在执行包括但不一定限于COM_PINGCOM_REFRESHCOM_INIT_DB的命令后返回 0.

Return Values

在前面的讨论中进行了描述。

Errors

在 multi INSERT语句中用户指定的AUTO_INCREMENT值落在当前AUTO_INCREMENT值与当前和受影响的行数之和之间的范围内。