0

我创建了一个 php 文件,它将数据从一个数据库服务器复制到另一个数据库服务器。

我的 php 文件:

<?php
    require_once 'config.php'; //just a php file for database connection

    try{  
        $pdo = new PDO('mysql:host=localhost;dbname=sampledb;', 'username', 'password' );
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $stmt = $pdo->prepare(
                "SELECT
                contro_number,name,date_save,date_received
                FROM
                    ETable
                WHERE
                   date_save IS NOT NULL AND date_received >= '2020-01-03'  
                    "
        );
        $stmt->execute();

        while( $row = $stmt->fetch(PDO::FETCH_ASSOC)) {
            insert_mysql($row["control_number"],$row["name"],$row["date_save"],$row["date_received"]);
        }
    }catch(PDOException $e){
        var_dump($e->getMessage());
    }
    $pdo = null; 


    function insert_mysql($control_number,$name,$date_save,$date_received)
    {
        try{
            $pdo = new PDO('mysql:host=localhost:3306;dbname=secondDB;', '', '' );
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $stmt = $pdo->prepare(
                    "INSERT INTO `MyTable`
                        (`control_number`,`name`,`date_save`,`date_received`)
                    VALUES
                        (:control_number,:name,:date_save,:date_received)
                            "
            );

            $stmt->bindValue( ':control_number', $control_number, PDO::PARAM_STR );
            $stmt->bindValue( ':name', $name, PDO::PARAM_STR );
            $stmt->bindValue( ':date_save', $date_save, PDO::PARAM_STR );
            $stmt->bindValue( ':date_received', $date_received, PDO::PARAM_STR );

            $flag = $stmt->execute();

            if( !$flag ) {
                $info = $stmt->errorInfo();
                exit($info[2]);
            }
            }catch(PDOException $e){
                var_dump($e->getMessage());
            }
            $pdo = null;
        }

    ?>

现在,我打算使用 .bat 文件让这个 php 文件每 10 分钟运行一次,以便自动插入数据。

但是,如果此文件将重复运行,则只会复制数据。

我必须执行什么查询或条件来首先过滤数据并检查它是否已经存在,如果不存在则插入数据?这样每次一个数据库中有新数据时,它都会自动复制或插入另一个数据库......

4

2 回答 2

0
  1. 您似乎没有在表中使用 id 列。最好添加一个以唯一标识行。

在 php 中执行此操作(不是最好的方法)需要检查可用性并插入

select id from yourtable where id= newidFromOtherServer;

并根据结果您是否应插入。

更好的方法是创建一个触发器并使用 https://dev.mysql.com/doc/refman/8.0/en/federated-storage-engine.html

但这会严重消耗你的资源。

于 2020-01-29T05:11:10.293 回答
-1

在从数据库 A 到 B 的每个副本存储最后一个 ID 并检查 ID 是否大于前一个之后,在两个数据库中添加另一个名为 last_sync 的表。

假设 last_sync 表保存了最后一个 ID 为 350,那么您应该将 ID>350 的记录移动到另一个数据库。这样会很容易。

更新

当您处理从 A 到 B 的记录时,还要从表 A 中选择 id 并在 while 循环中执行类似这样的操作

while( $row = $stmt->fetch(PDO::FETCH_ASSOC)){
insert_mysql($row["control_number"],$row["name"],$row["date_save"],$row["date_received"]); 
$lastid=$row["id"];
 }

$lastid 每次都会更新,你将复制最后一个 id,所以现在你必须将它插入 last_sync 表中,下次按照我所说的那样输入条件

于 2020-01-29T05:19:51.897 回答