27.7.6.38 mysql_insert_id()
my_ulonglong mysql_insert_id(MYSQL *mysql)
Description
返回由上一个INSERT或UPDATE语句为AUTO_INCREMENT
列生成的值。在对包含AUTO_INCREMENT
字段的 table 中执行INSERT语句或使用INSERT或UPDATE设置LAST_INSERT_ID(expr)的列值之后,请使用此功能。
除非在以下条件之一下显式更新,否则mysql_insert_id()的返回值始终为零:
-
将值存储在
AUTO_INCREMENT
列中的INSERT条语句。无论是通过将特殊值NULL
或0
存储到列中来自动生成该值,还是为显式的非特殊值,都是如此。 -
对于多行INSERT语句,mysql_insert_id()返回成功插入的第一个自动生成的
AUTO_INCREMENT
值。
如果没有成功插入任何行,则mysql_insert_id()返回 0.
-
如果执行插入...选择语句,并且没有成功插入自动生成的值,则mysql_insert_id()返回最后插入的行的 ID。
-
如果插入...选择语句使用LAST_INSERT_ID(expr),则mysql_insert_id()返回*
expr
*。 -
INSERT语句通过将LAST_INSERT_ID(expr)插入任何列或将任何列更新为LAST_INSERT_ID(expr)来生成
AUTO_INCREMENT
值。 -
如果前一条语句返回错误,则mysql_insert_id()的值不确定。
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_PING
,COM_REFRESH
和COM_INIT_DB
的命令后返回 0.
Return Values
在前面的讨论中进行了描述。
Errors
在 multi INSERT语句中用户指定的AUTO_INCREMENT
值落在当前AUTO_INCREMENT
值与当前和受影响的行数之和之间的范围内。