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
值与当前值和受影响行数之和之间的范围内。