INSERT在php脚本中不存在,比较2个表

时间:2017-10-18 14:01:57

标签: php mysql sql

我目前有一个每5分钟运行一次的脚本,并从服务器1上的表和server2上的相同表中选择数据。这是复制的一种解决方法,基本上,因为我们目前没有该选项。

脚本成功但我意识到它有时会因为某些原因而错过记录。当前脚本选择目标表中的所有记录,存储最大主键,从源表中选择所有数据,然后将具有更大主键的任何内容插入到dest中。表

我想略微修改脚本而不是使用max 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 个答案:

答案 0 :(得分:1)

您可以使用INSERT INTO SELECT并检查值是否已在目标中:

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);