我们在一台服务器上有一个电话系统数据库,但我们希望在我们的生产服务器上有一个更新的克隆。
我已经将原始文件转储到我们当地的生产服务器上,这很棒,但现在我必须继续更新其他服务器上的每日更改。
我正在尝试创建一个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));
答案 0 :(得分:1)
我认为最合适的方式必须是" log"包含ID的表。
但是,我认为行ID是主键。
所以,你想要一个脚本:
SELECT id FROM your_table WHERE id = $id
编辑: 基本上,你应该做这样的事情:
$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);