PHP
我有这张桌子
CREATE TABLE IF NOT EXISTS `t5` (
`id` int(11) NOT NULL auto_increment,
`a` int(11) NOT NULL,
`b` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `a` (`a`,`b`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
a_b是唯一的密钥。
我有这样的PHP代码
$db = DBFactory::getInstance();
$db->selectDB('test');
$db->query("insert into t5 (a, b) values(1, 1) on duplicate key update a=1, b=1");
var_dump(mysql_insert_id());
$cur = $db->query("select last_insert_id()");
var_dump(mysql_fetch_assoc($cur));
通过运行这个代码两次,在我的电脑上结果是第一
int(1)
array(1) {
["last_insert_id()"]=>
string(1) "1"
}
第2
int(1)
array(1) {
["last_insert_id()"]=>
string(1) "2"
}
你可以看到,两次mysql_insert_id()返回相同的值“1”,这对我来说很好,因为我想知道插入后的真实ID,但不是下一个auto_increment值。
但是当我在另一个环境上运行这个代码两次:1st
int(1)
array(1) {
["last_insert_id()"]=>
string(1) "1"
}
第2
int(2)
array(1) {
["last_insert_id()"]=>
string(1) "2"
}
正如你可以看到差异,第二次结果mysql_insert_id()返回与last_insert_id()相同的值。
这个结果是可怕的,但我不知道为什么。 我的代码在这两种环境下都能正常运行大约3个月,直到今天这种情况才发生。 有人可以解释吗? 大约30天前,我没有将第二个环境的PHP版本升级到5.3.8,没有其他更改。 这是一个错误?
更新
我切换到第三个mysql服务器(5.1.38-log),第二个插入返回int(0)数组(1){[“last_insert_id()”] => string(1)“0”}
所以我意识到这个问题可能是关于mysql版本的。
最后,我改变了表格定义到这个
DROP TABLE IF EXISTS `t5`;
CREATE TABLE IF NOT EXISTS `t5` (
`id` int(11) NOT NULL auto_increment,
`a` int(11) NOT NULL,
`b` int(11) NOT NULL,
`t` int(11) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `a` (`a`,`b`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
还编辑我的脚本
$db = DBFactory::getInstance();
$db->selectDB('test');
$db->query("insert into t5 (a, b, t) values(1, 1, ".time().") on duplicate key update a=1, b=1, t=".time());
//$db->query("insert ignore into t5 (a, b) values(1, 1)");
var_dump(mysql_insert_id());
$cur = $db->query("select last_insert_id()");
var_dump(mysql_fetch_assoc($cur));
不同的mysql服务器返回相同的mysql_insert_id,但不同的是last_insert_id()
5.0.24a社区-NT
int(1)
array(1) {
["last_insert_id()"]=>
string(1) "2"
}
5.0.51a日志
int(1)
array(1) {
["last_insert_id()"]=>
string(1) "2"
}
5.1.38日志
int(1)
array(1) {
["last_insert_id()"]=>
string(1) "0"
}
有没有系统变量控制这种行为? 如果有人知道这将是很好的。 如果没有解决方案,我唯一能做的就是像这样强制插入来更新一些具有不同值的字段。
我认为你正在尝试使用last_insert_id()
的方式并不意味着 - 在这种情况下,你没有插入任何东西,所以你也不应该相信返回值。 从MySQL文档:
如果一个表包含AUTO_INCREMENT列,并且INSERT ... UPDATE插入一行,则LAST_INSERT_ID()函数将返回AUTO_INCREMENT值。 如果语句更新一行,LAST_INSERT_ID()不是有意义的。
但是,似乎有一个解决方法(同一文档) - 手动设置last_insert_id:
但是,您可以使用LAST_INSERT_ID(expr)解决此问题。 假设id是AUTO_INCREMENT列。 要使LAST_INSERT_ID()对更新有意义,请按如下方式插入行:
INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;
上一篇: php