2017-10-18 7 views
1

私は現在、5分ごとに実行され、サーバ1のテーブルとサーバ2の同一のテーブルからデータを選択しています。これは、現時点ではそのオプションがないため、本質的に複製の回避策です。INSERT phpスクリプトに存在しない2つのテーブルを比較する

スクリプトが成功しているが、私はそれが何らかの理由で、時々記録を逃すことに気づきました。現在のスクリプトは、デスティネーションテーブルからすべてのレコードを選択し、最大プライマリキーを格納し、ソーステーブルからすべてのデータを選択し、大きなプライマリキーを持つものをすべてデスティネーションに挿入します。表。

私は、最大のIDを使用して、わずかにし、代わりにスクリプトを変更だけ言いたい「行が転送先テーブルに存在しない主キーを持っている場合、そこにその行を挿入します。」

再びこれらをクローン化されたテーブルので、構造が同じであり、それらの両方がAI主キーを使用します。

$latest_result = $conn2->query("SELECT MAX(`SESSIONID`) FROM 
`ambition`.`session`"); 
$latest_row = $latest_result->fetch_row(); 
$latest_session_id = $latest_row[0]; 

//Select All rows from the source phone database 
$source_data = mysqli_query($conn, "SELECT * FROM 
`cdrdb`.`session` WHERE `SESSIONID` > $latest_session_id"); 

// Loop on the results 
while($source = $source_data->fetch_assoc()) { 

// Check if row exists in destination phone database 
$row_exists = $conn2->query("SELECT SESSIONID FROM 
ambition.session WHERE SESSIONID = '".$source['SESSIONID']."' ") or 
die(mysqli_error($conn2)); 

//if query returns false, rows don't exist with that new ID. 
if ($row_exists->num_rows == 0){ 

//Insert new rows into ambition.session 
$stmt = $conn2->prepare("INSERT INTO ambition.session (SESSIONID, 
SESSIONTYPE,CALLINGPARTYNO,FINALLYCALLEDPARTYNO, 
DIALPLANNAME,TERMINATIONREASONCODE //etc. There are a lot of columns so I 
ommitted the others 

私は少しだけMAX IDに頼るのではなく、存在しないものを挿入するには、これを変更することができる方法があります:

ここでは、現在の作業スクリプトがですか?

それともレコードを欠けている理由として犯人だろうここに何かがあるのでしょうか?

答えて

1

あなたはINSERT INTO SELECTを使用して値が目標に既にあるかどうかを確認できます。OPは、2つの異なる接続間で動作する何かを望んでいるよう

INSERT INTO trg_table (cols) 
SELECT cols 
FROM src_table s 
WHERE NOT EXISTS (SELECT 1 FROM trg_table t WHERE t.id = s.id); 
+1

が見えます。 – Phylogenesis

+0

この場合、各テーブルは異なるサーバーにあるので、どのように修正する必要がありますか?だからこそ、私はそれ自身のクエリで各テーブルのステートメントを持っています。 –

+0

@TomN。 MySQLはDatabaselinkやリンクサーバーのようなものを持っていますか? – lad2025

関連する問題