我目前有一个每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?
或者这里有什么东西可能是它为什么缺少记录的罪魁祸首?
答案 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);