使用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() 来替代。
mysql:
LAST_INSERT_ID([expr])
AUTO_INCREMENT
列中的最后一个自动产生的值。查看章节 8.1.3.130 mysql_insert_id()
。
mysql> SELECT LAST_INSERT_ID(); -> 195
最后产生的 ID 是以每个连接为基础在服务器端被维护的。它不可能被其它的客户端连接改变。如果你以一个非特殊值(即一个非 NULL
和非 0
的值)更新其它的 AUTO_INCREMENT
,它甚至也不会改变。 如果你在同一时间内以一个插入语句插入了许多记录行,LAST_INSERT_ID()
将返回第一个被插入行的值。这样做的原因是因为,这可能列容易地在其它服务器上再现同一条 INSERT
语句。 如果 expr
被作为一个参数传递给 LAST_INSERT_ID()
,那么函数将返回这个参数的值,并且被设置为 LAST_INSERT_ID()
返回的下一个值。这可被用于模拟一个序列: 首先创建一个表:
mysql> CREATE TABLE sequence (id INT NOT NULL); mysql> INSERT INTO sequence VALUES (0);
然后这个表可以被用来以下面的方式产生序列值:
mysql> UPDATE sequence SET id=LAST_INSERT_ID(id+1);
你也可以不调用 LAST_INSERT_ID()
产生序列,但是以这种方式使用这个函数的作用就是,ID 值是在服务器端叙谈最后的自动产生值被维护的(是多用户安全的)。你可以检索这的新的 ID 值,就好像读取 MySQL 中任何正常的 AUTO_INCREMENT
值一样。举例来说,LAST_INSERT_ID()
(无任何参数) 将返回一个新的 ID。C API 函数 mysql_insert_id()
也可以用来得到这个值。 注意,由于 mysql_insert_id()
仅仅只能用于在 INSERT
和 UPDATE
语句的更新之后,所以在执行了其它的 SQL 语句(比如 SELECT
或 SET
)之后,你不能够使用 C API 函数检索到 LAST_INSERT_ID(expr)
的值。
No Responses (yet)
Stay in touch with the conversation, subscribe to the RSS feed for comments on this post.