使用php mysql_insert_id() 函数将会返回错误值
应使用SELECT LAST_INSERT_ID();需紧跟insert语句。
以下是手册描述:
php:
mysql_insert_id() 将 MySQL 内部的 C API 函数 mysql_insert_id() 的返回值转换成 long(PHP 中命名为 int)。如果 AUTO_INCREMENT 的列的类型是 BIGINT,则 mysql_insert_id() 返回的值将不正确。可以在 SQL 查询中用 MySQL 内部的 SQL 函数 LAST_INSERT_ID() 来替代。
<font face="新宋体" color="#000000" size="5"><strong>mysql:</strong></font><strong><font face="新宋体"></font></strong><font face="新宋体" color="#800080" size="3">LAST_INSERT_ID([expr])</font> <font face="新宋体" color="#800080">AUTO_INCREMENT</font> 列中的最后一个自动产生的值。查看章节 8.1.3.130 <font face="新宋体">mysql_insert_id()</font>。 mysql> SELECT LAST_INSERT_ID();
-> 195
最后产生的 ID 是以每个连接为基础在服务器端被维护的。它不可能被其它的客户端连接改变。如果你以一个非特殊值(即一个非 <font face="新宋体" color="#800080">NULL</font> 和非 <font face="新宋体" color="#800080">0</font> 的值)更新其它的 <font face="新宋体" color="#800080">AUTO_INCREMENT</font>,它甚至也不会改变。 如果你在同一时间内以一个插入语句插入了许多记录行,<font face="新宋体" color="#800080">LAST_INSERT_ID()</font> 将返回第一个被插入行的值。这样做的原因是因为,这可能列容易地在其它服务器上再现同一条 <font face="新宋体" color="#800080">INSERT</font> 语句。 如果 <font face="新宋体" color="#800080">expr</font> 被作为一个参数传递给 <font face="新宋体" color="#800080">LAST_INSERT_ID()</font>,那么函数将返回这个参数的值,并且被设置为 <font face="新宋体" color="#800080">LAST_INSERT_ID()</font> 返回的下一个值。这可被用于模拟一个序列: 首先创建一个表: mysql> CREATE TABLE sequence (id INT NOT NULL); mysql> INSERT INTO sequence VALUES (0);然后这个表可以被用来以下面的方式产生序列值:
mysql> UPDATE sequence SET id=LAST_INSERT_ID(id+1);你也可以不调用
<font face="新宋体" color="#800080">LAST_INSERT_ID()</font> 产生序列,但是以这种方式使用这个函数的作用就是,ID 值是在服务器端叙谈最后的自动产生值被维护的(是多用户安全的)。你可以检索这的新的 ID 值,就好像读取 MySQL 中任何正常的 <font face="新宋体" color="#800080">AUTO_INCREMENT</font> 值一样。举例来说,<font face="新宋体" color="#800080">LAST_INSERT_ID()</font>(无任何参数) 将返回一个新的 ID。C API 函数 <font face="新宋体" color="#800080">mysql_insert_id()</font> 也可以用来得到这个值。 注意,由于 <font face="新宋体" color="#800080">mysql_insert_id()</font> 仅仅只能用于在 <font face="新宋体" color="#800080">INSERT</font> 和 <font face="新宋体" color="#800080">UPDATE</font> 语句的更新之后,所以在执行了其它的 SQL 语句(比如 <font face="新宋体" color="#800080">SELECT</font> 或 <font face="新宋体" color="#800080">SET</font>)之后,你不能够使用 C API 函数检索到 <font face="新宋体" color="#800080">LAST_INSERT_ID(expr)</font> 的值。

No Responses (yet)
Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.