在MS Access和MySQL之间同步数据的最佳方法是什么?

时间:2009-01-14 13:24:54

标签: mysql database ms-access odbc

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

有没有更好的方法来执行此操作,可能使用ODBC连接或其他?

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

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

5 个答案:

答案 0 :(得分:3)

为什么不按照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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

为了帮助仅传输更改,我建议您在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记录,或将其保留为审计跟踪。

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

答案 3 :(得分:0)

中查看我的回答

Access DB5 to MySQL automatically

答案 4 :(得分:-1)

我会做以下事情:

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

  1. 在MySql中运行UPDATE脚本 更新匹配记录
  2. 在MySql中运行INSERT脚本 插入新记录
  3. (可选,取决于是否这样 是你想要的):运行DELETE MySql中的脚本删除记录 那是新发现的 导入的访问表。
  4. 在MySql中删除临时表。
  5. 可以通过链接表从MS Access内部完成所有这些操作。但是性能不会那么好,并且如果你的MySql表发生变化,它将需要更改Access语句。

    This answer may be helpful to you, too