文档主页
MySQL 9.0 C API 开发者指南
下载本手册
PDF (US Ltr) - 1.4Mb
PDF (A4) - 1.4Mb


5.4.42 mysql_insert_id()

uint64_t
mysql_insert_id(MYSQL *mysql)

描述

返回由之前的 INSERTUPDATE 语句为 AUTO_INCREMENT 列生成的值。在对包含 AUTO_INCREMENT 字段的表执行 INSERT 语句后,或使用 INSERTUPDATE 将列值设置为 LAST_INSERT_ID(expr) 后,请使用此函数。

除非在以下情况之一明确更新,否则 mysql_insert_id() 的返回值始终为零

mysql_insert_id() 的返回值可以简化为以下顺序

  1. 如果存在 AUTO_INCREMENT 列,并且成功插入了自动生成的值,则返回第一个此类值。

  2. 如果语句中出现了 LAST_INSERT_ID(expr),则返回 expr,即使受影响的表中存在 AUTO_INCREMENT 列。

  3. 返回值因使用的语句而异。在 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_PINGCOM_REFRESHCOM_INIT_DB)后返回 0。

返回值

在前面的讨论中描述。

错误

  • ER_AUTO_INCREMENT_CONFLICT

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