php – mysql_insert_id和last_insert_id错误的行为
我有这张桌子
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值. 但是,当我在另一个环境中运行此代码两次: 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),第二个插入返回 所以我意识到问题可能是关于mysql版本. 最后,我将表定义更改为此 DROP TABLE IF EXISTS `t5`; CREATE TABLE IF NOT EXISTS `t5` ( `id` int(11) NOT NULL auto_increment,`t` int(11) NOT NULL,`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,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 docs开始:
但是,似乎有一个解决方法(相同的文档) – 手动设置last_insert_id:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |