我在 users 表中插入一行来注册新用户。我想获取user_id字段(这是自动增量)并在另一个查询中使用它。这里提供了一个解决方案: How to get the ID of INSERTed row in mysql?但我想知道如果另一个用户在我插入新行后立即注册,并且在我的php代码中运行mysql_insert_id()函数之前会发生什么。该函数将返回什么?
答案 0 :(得分:7)
mysql_insert_id()
返回特定于当前连接的auto_increment
id(特定于用户会话)。因此,这种竞争条件是安全的。换句话说,两个插入重叠的并发用户将始终在不受干扰的情况下为自己的会话返回正确的ID。
答案 1 :(得分:1)
int mysql_insert_id ([ resource $link_identifier ] )
是你的朋友。
来自php文档:http://es2.php.net/manual/en/function.mysql-insert-id.php
注意:
MySQL连接。如果未指定链接标识符,则假定mysql_connect()打开的最后一个链接。如果没有找到这样的链接,它将尝试创建一个,就好像没有参数调用mysql_connect()一样。如果未找到或建立连接,则会生成E_WARNING级别错误。
上一次成功查询为AUTO_INCREMENT列生成的ID,如果上一个查询未生成AUTO_INCREMENT值,则为0;如果未建立MySQL连接,则为FALSE。
mysql_insert_id()会将原生MySQL C API函数mysql_insert_id()的返回类型转换为long类型(在PHP中命名为int)。如果AUTO_INCREMENT列的列类型为BIGINT(64位),则转换可能会导致值不正确。而是在SQL查询中使用内部MySQL SQL函数LAST_INSERT_ID()。有关PHP的最大整数值的更多信息,请参阅整数文档。
因为mysql_insert_id()作用于上次执行的查询,所以请务必在生成值的查询后立即调用mysql_insert_id()。
MySQL SQL函数LAST_INSERT_ID()的值始终包含最近生成的AUTO_INCREMENT值,并且不会在查询之间重置。