使用mysqli将行从一个数据库移动到另一个数据库

pkln4tw6  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(355)

我的问题很直截了当,我认为人们需要经常这样做;然而,经过几个小时的网上搜索,没有什么特别有启发性的。我知道这里有一个关于使用pdo做同样事情的帖子,但是我想坚持mysqli在我的整个网站上保持一致。
因此,我需要将一个或多个行从一个数据库移到另一个数据库(而不是从一个数据库中的一个表移到另一个表)。
到目前为止,我的代码肯定会得到一些笑声,因为这个任务被证明是远远超出我的能力。不管怎样,这里是:
首先,我有两个 mysqli_connect ... 我不确定这是否受到鼓励,尽管到目前为止还没有给我带来麻烦。

$connect_MAIN = mysqli_connect($servername_MAIN, $username_MAIN, $password_MAIN, $dbname_MAIN); 
$connect_TEMP = mysqli_connect($servername_TEMP, $username_TEMP, $password_TEMP, $dbname_TEMP);

以下是三明治中的肉的代码:

///Prepare this in advance because the 'IN' values are taken from a $_GET
$sql_select = "SELECT * FROM Concert WHERE id IN (1, 2, 3, 4)";

///Connect to source DB
$result = $connect_TEMP->query($sql_select);

if ($result->num_rows != 0) {

    ///Connect to destination DB
        $stmt = $connect_MAIN->prepare('INSERT INTO Concert (venue_id, date, ensemble_id, info, title, repertoire, time) VALUES (?, ?, ?, ?, ?, ?, ?)');
        $venue_id = $date = $ensemble_id = $info = $title = $repertoire = $time = null;
        $stmt->bind_param("isissss", $venue_id, $date, $ensemble_id, $info, $title, $repertoire, $time);

        while($row = $result->fetch_assoc()) {
            $venue_id = $row["venue_id"];
            $date = $row["date"];
            $ensemble_id = $row["ensemble_id"];
            $info = $row["info"];
            $title = $row["title"];
            $repertoire = $row["repertoire"];
            $time = $row["time"];

            if ($stmt->execute() === TRUE) {
                if ($show_once == 1) {
                    echo "Info successfully submitted.";
                    $show_once = 0;
                }
            } else { 
                echo "Hmm, something went wrong..." . $connect_MAIN->error;
            }
        }
    }
$stmt->close();
mysqli_close($connect_TEMP); 
}

所以,我知道这有点混乱。。。正如我所说的,我不确定是否有可能在 while 循环从db1返回值。尽情嘲笑吧,但前提是你有什么有用的建议!

jk9hmnmh

jk9hmnmh1#

如果您正在运行自己的mysql服务器,那么可以使用联邦引擎以一种更简单的方式来实现这一点。
联邦表的行为类似于普通表,但它将数据存储在远程数据库中。有了这个引擎,你可以做这样的事情:

INSERT INTO remoteTable (values) SELECT * FROM localTable
sbtkgmzw

sbtkgmzw2#

使用参数化查询而不是连接字符串。

///Prepare this in advance because the 'IN' values are taken from a $_GET
$sql_select = "SELECT * FROM Concert WHERE id IN (1, 2, 3, 4)";

///Connect to source DB
$result = $connect_TEMP->query($sql_select);
if ($result->num_rows != 0) {
    ///Connect to destination DB
    $stmt = $connect_MAIN->prepare('INSERT INTO Concert (venue, date, info, time) VALUES (?, ?, ?, ?)');
    $venue = $date = $info = $time = null;
    $stmt->bind_param("ssss", $venue, $date, $info, $time);
    while($row = $result->fetch_assoc()) {
        $venue = $row["venue"];
        $date = $row["date"];
        $info = $row["info"];
        $time = $row["time"];
        if ($stmt->execute()) {
            ///This is just to stop message from appearing multiple times.
            if ($show_once == 1) {
                echo "Info successfully submitted.";
                $show_once = 0;
            }
        } else { 
            echo "Hmm, something went wrong..." . $stmt->error;
        }
    }
    $stmt->close();
    mysqli_close($connect_TEMP); 
}
qjp7pelc

qjp7pelc3#

是的,您可以在脚本中的任意点建立第二个db连接。没有什么能阻止它,也没有理由阻止它。这比你想象的要普遍得多(因为不同的原因)。但是,考虑到实际连接到数据库所带来的开销,我建议您不要在每次迭代中建立连接(这是最佳实践,从性能Angular 看)
我要做的是:
首先,连接到源数据库,获取所需的数据
这里没什么好说的,你已经做了,看起来还可以。像你做的那样,在继续之前,检查至少有一个结果。如果结果集为空,则不要继续(退出)
如果结果集中至少有一行,请建立到目标数据库的连接
在开始循环之前执行此操作,以避免建立多个连接的性能损失。如果您看到成百上千行或更多行,您会真正注意到其中的差异。一旦建立了连接,继续
遍历源数据并准备insert语句
你可以选择。a)遍历整个结果集,准备一个包含多行的插入,然后在循环结束时一次插入所有行;b)在每个迭代中创建一个插入(单行),运行插入,然后继续下一个迭代。
这两种策略都有赞成和反对的理由。选一个更适合你的。
在算法方面,您的代码已经准备就绪(只需在开始循环之前连接到目标数据库一次)。使用带绑定的参数化查询而不是编写完整的插入字符串可能会使您受益匪浅,但除此之外,您几乎可以做到这一点。

相关问题