5

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

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

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

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

4

5 回答 5

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

于 2009-01-14T13:47:28.107 回答
1

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

于 2009-01-14T13:29:56.503 回答
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 记录,或将它们保留为审计跟踪。

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

于 2009-01-14T13:46:52.850 回答
0

请参阅我的答案

自动访问 DB5 到 MySQL

于 2009-01-14T13:50:27.477 回答
-1

我会做以下事情:

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

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

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

这个答案也可能对你有帮助

于 2009-01-14T13:40:03.160 回答