如何使用 ODBC 驱动程序仅从 MS Access 向 MySql 自动插入新记录?

Posted

技术标签:

【中文标题】如何使用 ODBC 驱动程序仅从 MS Access 向 MySql 自动插入新记录?【英文标题】:How to auto insert only new record from MS Access to MySql using ODBC driver? 【发布时间】:2016-09-09 11:37:09 【问题描述】:

我正在从 MS Access 检索出勤日志到 mysql 数据库。 我只想从 MS Access 数据源获取/检索新记录并上传到 MySql 数据库(首选自动)。 以下是我目前的代码,请帮忙:

<?php 
// Connect to MySql Local Database
$con = mysqli_connect("localhost", "root", "");

// Connect to Microsoft Access Using ODBC Driver
$connection = odbc_connect("Driver=Microsoft Access Driver (*.mdb, *.accdb);Dbq=C:\Program Files (x86)\ZKTeco\att2000.mdb", "", "");

// Check if Connect works
if($connection)
    echo odbc_autocommit($connection);
    $QUERY  = odbc_exec($connection, "SELECT * FROM `CHECKINOUT`") or die(odbc_error($connection));


 //If have records in MS Access Data Source
        if(odbc_fetch_row($QUERY) > 0)
            while ($ATT = odbc_fetch_array($QUERY)) 
                $result = $ATT["CHECKTIME"];

            // Here I want to Insert only New Records from MS Access 

            $INSERT = mysqli_query($con, "INSERT INTO `odbc`.`attendance` (`DATETIME`, `DATE`, `TIME`) VALUES ('$result', '$result', '$result')") or die(mysqli_error($con));
        
    
    echo odbc_commit($connection);
else
    echo "False";

?>

【问题讨论】:

首先你应该解释你的代码有什么问题。那么如果这是一个 Oneshot 操作,那么从 MS Access 而不是 PHP 执行此操作会容易得多。 什么定义了新记录?您真的是指非重复记录吗? @Parfait 是的,我不想要重复的记录,因为每次提交此表单时都会重复记录。 【参考方案1】:

考虑使用一个临时表 attendance_temp,它在结构上与最终表 attendance 完全相同,但每次运行脚本都会定期清理:

mysqli_query($con, "DELETE FROM `odbc`.`attendance_temp`");    # OUTSIDE WHILE LOOP
...
$INSERT = mysqli_query($con, 
                       "INSERT INTO `odbc`.`attendance_temp` (`DATETIME`, `DATE`, `TIME`)
                        VALUES ('$result', '$result', '$result')")

填充临时表后,从临时表到最终表运行NOT IN / NOT EXISTS / LEFT JOIN...IS NULL 查询以避免最终目标表中的重复记录:

INSERT INTO odbc.`attendance` (`DATETIME`, `DATE`, `TIME`)
SELECT t.`DATETIME`, t.`DATE`, t.`TIME`
FROM `odbc`.`attendance_temp` t
LEFT JOIN `odbc`.`attendance` f
ON t.`DATETIME` = f.`DATETIME`
WHERE f.`DATETIME` IS NULL;

【讨论】:

以上是关于如何使用 ODBC 驱动程序仅从 MS Access 向 MySql 自动插入新记录?的主要内容,如果未能解决你的问题,请参考以下文章

比较c#中sql server和ms访问的数据类型

ODBC 驱动程序(AcuODBC、MS Access 驱动程序)

如何使用 MS Access 实现 Java Persistence Api?

ODBC 调用失败 - 错误 3151

ODBC:用于 MS Access 的 SQL Server 2008 驱动程序

除了 ms-access 之外,我可以使用哪些其他程序连接到 odbc 数据库