仅将新记录从一个数据库服务器插入另一个数据库服

时间:2017-09-18 15:44:36

标签: php mysql sql

我们在一台服务器上有一个电话系统数据库,但我们希望在我们的生产服务器上有一个更新的克隆。

我已经将原始文件转储到我们当地的生产服务器上,这很棒,但现在我必须继续更新其他服务器上的每日更改。

我正在尝试创建一个php脚本,它只是检查另一台服务器上的每个表,然后将每个表中的任何新记录插入到我们的生产数据库的克隆表中。

下面是测试选择/插入块。选择查询没有错误,但我的插入返回错误,因为我认为我错误地使用NOT EXISTS。我不知道这是否是最好的选择。

会话表有大约35列,所以我正在寻找最好的方法来解决这个问题,而不必在可能的情况下声明每一列。我唯一想到的是SESSION.SESSIONID字段是主键。所以我的逻辑是if the sessionid from the phone server doesn't exist yet in the prod server, insert the whole record

显然我的语法在插入时是错误的,只是寻找一些关于如何在每15分钟运行一次脚本时将所有新记录从server1.session插入server2.session的指导。

//Defining credentials
$servername = "";
$username = "";
$password = "";

$servername2 = "";
$username2 = "";
$password2 = "";

// Create connection
$conn = new mysqli($servername, $username, $password);
$conn2 = new mysqli($servername2, $username2, $password2);

// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
echo "Connected successfully";

// Check connection2
if ($conn2->connect_error) {
die("Connection failed: " . $conn2->connect_error);
}
echo "Connected successfully";


//Query to select * from Session table on server 1
$query1 = "select * from cdrdb.session";
$results = mysqli_query($conn1, $query1);

foreach ($results as $r => $result) {

}

$stmt1 = mysqli_prepare($conn2, "insert into ambition.session a where not 
exists(a.SESSIONID)");
mysqli_stmt_execute($stmt1) or die(mysqli_error($conn2));

2 个答案:

答案 0 :(得分:1)

我认为最合适的方式必须是" log"包含ID的表。

但是,我认为行ID是主键。

所以,你想要一个脚本:

  1. 从源表中获取所有行
  2. 使用foreach循环播放
  3. 切换数据库
  4. 对目标数据库执行SQL检查:SELECT id FROM your_table WHERE id = $id
  5. 如果您有结果(请使用numRows()检查),请不要做任何事情。
  6. 如果您没有,请使用foreach
  7. 中的值插入目标表

    编辑: 基本上,你应该做这样的事情:

    $source_db = array(
        'host' => 'source_host',
        'name' => 'source_name',
        'user' => 'source_user',
        'pass' => 'source_pass'
    );
    
    $dest_db = array(
        'host' => 'dest_host',
        'name' => 'dest_name',
        'user' => 'dest_user',
        'pass' => 'dest_pass'
    );
    
    $source_conn = new mysqli($source_db['host'], $source_db['user'], $source_db['pass'], $source_db['name']);
    $dest_conn = new mysqli($dest_db['host'], $dest_db['user'], $dest_db['pass'], $dest_db['name']);
    
    // Get all rows from source database
    $source_data = $source_conn->query("SELECT * FROM source_table");
    
    // Loop on the results
    while($source_item = $source_data->fetch_assoc()) {
    
        // Check if row exists in dest database
        $row_exists = $dest_conn->query("SELECT id FROM dest_table WHERE id = '".$source_item['id']."' ");
    
        // If the query returns FALSE, the row does not exist
        if(!$row_exists) {
    
            // Insert the new row in dest database
            $dest_conn->query("INSERT INTO dest_table (id, name) VALUES ('".$source['id']."', '".$source['name']."' ");
        }
    
    }
    

答案 1 :(得分:1)

在SQL中,EXISTS子句(?)是一个子查询,看起来像这样(... WHERE EXISTS(SELECT ... FROM table ...)) 另外,您没有在insert语句中说明要插入什么。 所以我会做这样的事情:

INSERT ambition.session a (col_a, col_b, ...) SELECT col_a, col_b, ... FROM cdrdb.session c WHERE NOT EXISTS (SELECT 1 FROM ambition.session a2 WHERE a2.SESSIONID = c.SESSIONID);

或者您可以执行INSERT IGNORE ...如果它会导致重复键并省略整个WHERE子句,将忽略插入,但我不知道这是否会带来性能问题。

我读到你可能会遗漏列名,但我不知道它是否属实。然后:

INSERT ambition.session a SELECT * FROM cdrdb.session c WHERE NOT EXISTS (SELECT 1 FROM ambition.session a2 WHERE a2.SESSIONID = c.SESSIONID);