gpt4 book ai didi

PHP/mysqli : unintended rollback in query across two mysql databases

转载 作者:行者123 更新时间:2023-11-29 15:42:37 25 4
gpt4 key购买 nike

我正在尝试从备份数据库恢复一些数据。所有表都是 Innodb,我使用 PHP/mysqli 编写脚本。我正在尝试有或没有交易,但这没有什么区别。

因此,我以用户“root”身份打开数据库连接并执行以下操作:

INSERT INTO maindb.table1 SELECT * FROM backupdb.table1 WHERE user_id = 1234;

之后,affected_rows 返回 825 行,正如它应该的那样。任何地方似乎都没有错误。即时

SELECT COUNT(*) FROM table1 WHERE user_id = 1234

显示 825 行。

但是,脚本退出后,table1 中 user_id 1234 的行数再次为 0。

看起来最后有一个自动回滚,但我一生都无法理解为什么。也许是因为涉及两个数据库?我以前从未听说过这样的行为。

当我以 root 身份在 mysql 命令行上运行相同的查询时,行已正确插入,之后的行数为 825。

这是我的示例代码:

$db = new mysqli(
'localhost',
'root',
$password,
'maindb'
);

$uid = 1234;

//$db->begin_transaction();
$db->query("INSERT INTO maindb.table1 SELECT * FROM backupdb.table1 WHERE user_id = $uid");
echo "table1: " . $db->affected_rows . "\n";
$st = $db->query("SELECT count(*) FROM maindb.table1 WHERE user_id = $uid");
var_dump($st->fetch_all());
//$db->commit();

$db->close();

结果:

table1: 825
array(1) {
[0]=>
array(1) {
[0]=>
string(3) "825"
}
}

有什么想法为什么会发生回滚以及如何避免它吗?

最佳答案

哎呀。找到了,罪魁祸首是:

REPLACE INTO maindb.user SELECT * FROM backupdb.user WHERE id =  $uid

这是在脚本的末尾,我省略了。 mysql REPLACE 的作用是删除用户(包括其他表中的所有相关数据 -> ON DELETE CASCADE)并重新插入行。这意味着之前复制的所有数据都将被删除。抱歉造成困惑。

关于PHP/mysqli : unintended rollback in query across two mysql databases,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57440327/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com