【问题标题】:What is the best way to synchronize data between MS Access and MySQL?在 MS Access 和 MySQL 之间同步数据的最佳方式是什么?
【发布时间】:2009-01-14 13:24:54
【问题描述】:

我在 Windows 机器上有一个访问数据库,我必须将其导入 linux 网络服务器上的 mysql。目前access dabatbase表导出为文本文件,用ftp自动复制,然后加载到mysql中。

有没有更好的方法来做到这一点,也许使用 ODBC 连接或其他方式?

限制复制已经存在的信息的最佳方法是什么,即仅传输在 access 数据库中但尚未在 mysql 数据库中的记录。

access 数据库由另一个程序处理,如果我不必对其进行更改,甚至不必打开它,那将是最好的。不可能需要从访问数据库中导入更新的记录。 mysql数据库将是主要来源,一些记录将被删除或更改。我只想导入从未在mysql数据库中的记录,而不是恢复那些故意删除的记录。

【问题讨论】:

    标签: mysql database ms-access odbc


    【解决方案1】:

    为什么不按照 Keltia 的建议通过 ODBC 链接表,然后使用一系列查询来添加丢失的记录并更新更改的记录。查询可以通过 VBA 运行。 ADO 也适用于 MySQL 和 Access。

    关于 Access 中使用的代码的一些说明:

       Set db = CurrentDb
       strSQL = "Insert INTO [ODBC;DSN=DSNName;].NameOfMySQLTable " _
       & "Select AnyField As NameOfMySQLField FROM AnyAccessTable;"
    
       db.Execute strSQL, dbFailOnError
       End Sub
    

    -- http://forum.lessthandot.com/viewtopic.php?f=95&t=3862

    【讨论】:

    • 如果我需要使用无 DSN 的 ODBC 连接,语法如何? (“[ODBC;Driver={...};Server=...;Database=...;User=...;Password=...;]” 不起作用。)
    • @oli_arborum 为您的计算机获得正确语法的最简单方法是使用向导将 MySQL 表链接到 Access,然后查看 tabledef 的连接属性。连接字符串可以用来代替ODBC;DSN=DSNName; 这也总是有用的:connectionstrings.com/mysql
    • 感谢您的提示。我的错误是在 {} 括号中使用了驱动程序名称。省略它们有效!
    【解决方案2】:

    如果您确实需要增量更新,方法是编写一个连接到两个数据库的脚本(至少在 Access 端通过 ODBC)并比较所有表。复制整个东西的好处是你肯定不会忘记任何东西,缺点可能是大小和mysql在重新加载期间将不可用的事实。

    【讨论】:

      【解决方案3】:

      为了帮助仅传输更改,我建议您在 Access 数据库中添加一个名为 RecordChanges 之类的新表。

      表结构如下:

      RecordChangeID (int) - Primary Key (Autonumber)
      TableName (varchar(250)) - Name of table that changed
      RecordID (int) - ID of the record in that table that was added / modified
      RecordAction (char(1)) - 'A' if add, 'M' if modified or 'D' if deleted
      

      注意 - 通过向其中添加用户 ID 和其他详细信息,您可以获得很好的审计跟踪。

      这是最痛苦的部分 - 但我会在您的应用程序中创建一个子例程,以便在您想要与 MySQL 数据库同步的表中每次更改记录时向该表添加一条记录。

      完成此操作后,我将创建另一个只有一条记录的表,称为 ExportStatus,其结构如下:

      LastRecordChangeID (int) - ID of the last Record Change 
                                 you exported in the Record Changes table
      

      然后创建一个子例程来检查自上次导出以来的所有记录更改(您从 ExportStatus 表中检索它)并生成 SQL 语句来更新您的 MySQL 数据库,确保在完成后更新您的 ExportStatus 表。您可以删除所有已成功导出的 RecordChange 记录,或将它们保留为审计跟踪。

      在实施此之前,您需要按照当前的方式进行初始同步。

      【讨论】:

        【解决方案4】:

        【讨论】:

        • 你的回答不适合这种情况
        • 我认为您可以复制访问数据库并加载所需表
        【解决方案5】:

        我会做以下事情:

        将所有 Access 数据转储到 MySQL 中的临时表中,该表将暂时成为您的“主”数据源。您应该能够通过设置指向 MySQL 的 ODBC 数据源、右键单击 Access 表并点击“导出”来完成此操作。

        1. 在 MySql 中运行 UPDATE 脚本以 更新匹配记录
        2. 在 MySql 中运行 INSERT 脚本以 插入新记录
        3. (可选,取决于这是否 是你想要的):运行 DELETE MySql中删除记录的脚本 在新发现的 已导入 Access 表。
        4. 删除 MySql 中的临时表。

        可以通过链接表在 MS Access 内部完成所有这些操作。但是性能不会那么好,并且当/如果您的 MySql 表发生更改时,它将需要更改 Access 语句。

        This answer may be helpful to you, too.

        【讨论】:

        • 可以在不改变访问数据库的情况下自动完成吗?
        • 此方法需要从 Access 内部运行插入语句,因此您必须添加该语句。但是,您的数据结构根本不需要更改。
        猜你喜欢
        • 1970-01-01
        • 2010-09-27
        • 1970-01-01
        • 2012-03-16
        • 1970-01-01
        • 2017-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多