uint64_t
mysql_insert_id(MYSQL *mysql)
返回由之前的 INSERT 或 UPDATE 语句为 AUTO_INCREMENT 列生成的值。在对包含 AUTO_INCREMENT 字段的表执行 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。 如果执行
INSERT ... SELECT语句,并且没有自动生成的值被成功插入,mysql_insert_id()将返回最后插入行的 ID。如果
INSERT ... SELECT语句使用LAST_INSERT_ID(,则expr)mysql_insert_id()返回expr。通过将
LAST_INSERT_ID(插入到任何列或将任何列更新为expr)LAST_INSERT_ID(生成expr)AUTO_INCREMENT值的INSERT语句。如果上一条语句返回错误,则
mysql_insert_id()的值未定义。
mysql_insert_id() 的返回值可以简化为以下顺序
如果存在
AUTO_INCREMENT列,并且成功插入了自动生成的值,则返回第一个此类值。如果语句中出现
LAST_INSERT_ID(,则返回expr)expr,即使受影响表中存在AUTO_INCREMENT列也是如此。-
返回值根据使用的语句而异。在
INSERT语句后调用时如果表中存在
AUTO_INCREMENT列,并且该列有一些显式值已成功插入到表中,则返回最后一个显式值。
在
INSERT ... ON DUPLICATE KEY UPDATE语句后调用时如果表中存在
AUTO_INCREMENT列,并且有一些显式成功插入的值或一些已更新的值,则返回最后一个插入或更新的值。
如果上一条语句未使用 AUTO_INCREMENT 值,则 mysql_insert_id() 返回 0。如果必须保存该值以供以后使用,请务必在生成该值的语句之后立即调用 mysql_insert_id()。
mysql_insert_id() 的值仅受当前客户端连接中发出的语句的影响。它不受其他客户端发出的语句的影响。
LAST_INSERT_ID() SQL 函数将包含成功插入的第一个自动生成的值。 LAST_INSERT_ID() 在语句之间不会重置,因为该函数的值在服务器中维护。与 mysql_insert_id() 的另一个区别是,如果将 AUTO_INCREMENT 列设置为特定的非特殊值,则 LAST_INSERT_ID() 不会更新。请参阅 信息函数。
在为生成 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 列发生情况的更准确信息。
客户端/服务器协议中使用的 OK 数据包包含用于会话状态跟踪的信息。当客户端读取 OK 数据包以了解是否存在会话状态更改时,这将重置诸如最后插入 ID 和受影响行数之类的值。此类更改会导致 mysql_insert_id() 在执行命令(包括但不限于 COM_PING、COM_REFRESH 和 COM_INIT_DB)后返回 0。
-
多
INSERT语句中用户指定的AUTO_INCREMENT值介于当前AUTO_INCREMENT值与当前值和受影响行数之和之间。