我有这张桌子
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"
}
第二
int(1)
array(1) {
["last_insert_id()"]=>
string(1) "2"
}
您可以看到,两次 mysql_insert_id() 返回相同的值“1”,这对我来说很好,因为我想知道插入后的真实 id,而不是下一个 auto_increment 值。
但是当我在另一个环境中运行此代码两次时:第一次
int(1)
array(1) {
["last_insert_id()"]=>
string(1) "1"
}
第二
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),第二个insert return int(0) array(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"
}
是否有任何系统变量控制这种行为?如果有人知道那将是欢迎的。如果没有解决方案,我唯一能做的就是像这样强制插入以更新一些具有不同值的字段......