Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
插入未插入的位置';不存在于php脚本中,比较两个表_Php_Mysql_Sql - Fatal编程技术网

插入未插入的位置';不存在于php脚本中,比较两个表

插入未插入的位置';不存在于php脚本中,比较两个表,php,mysql,sql,Php,Mysql,Sql,我目前有一个脚本,每5分钟运行一次,从服务器1上的表和服务器2上的相同表中选择数据。从本质上说,这是复制的一种变通方法,因为我们目前没有这个选项 这个脚本是成功的,但我意识到它有时会因为任何原因丢失记录。当前脚本从目标表中选择所有记录,存储max主键,从源表中选择所有数据,然后将主键较大的任何内容插入dest。桌子 我想稍微修改一下脚本,而不是使用max id,只需说“如果一行的主键在目标表中不存在,请在那里插入该行。” 同样,这些表是克隆表,因此结构相同,它们都使用AI主键 以下是当前的工作脚

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

这个脚本是成功的,但我意识到它有时会因为任何原因丢失记录。当前脚本从目标表中选择所有记录,存储max主键,从源表中选择所有数据,然后将主键较大的任何内容插入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


或者这里有什么东西可能是它丢失记录的罪魁祸首吗?

您可以使用
插入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);

看起来OP需要能够跨两个不同连接工作的东西。但是,在这种情况下,由于每个表位于不同的服务器上,我必须如何修改它?这就是为什么每个表都有自己的语句query@TomN. MySQL有类似Databaselink或链接服务器的功能吗?有一种机制允许这样做。然而,这可能需要重新编译二进制文件和更改配置。@您的答案的逻辑肯定是我想要的,我只是好奇如何将其拆分为不同的语句,以便它们可以使用各自的连接