如果两个数据库都需要更新,那么同步两个数据库是非常非常复杂的。如果一方是另一方的奴隶,那就不那么困难了。我不止一次使用Access对这种同步进行编程,一次使用Web服务器上的MDB,并且必须与本地数据MDB同步(合并网站上编辑的数据;没有编辑返回到网站,所以单向同步,但仍然需要在非网页上合并编辑),以及一旦编程网站上的MySQL与主站(MySQL)/奴隶(Access)关系中的Access之间的同步。
在网站上,您将每个表格的数据转储编程为文本文件。在MySQL表中有时间戳字段是很有帮助的,这样您就可以知道记录何时被创建和更新。这使您可以选择自上次数据转储以来要转储哪些记录(这使Access侧的数据同步变得更简单)。
我编程的方式是,然后将文本文件导入临时表,这些临时表被合适地编入索引并链接到前端Access应用程序。一旦数据转储导入到临时表,你再有三项任务:
找到新的记录,并把它们添加到访问数据存储。这很容易通过外部连接完成。
处理删除。我稍后会讨论它,因为它很复杂。
处理更新记录。为此,我编写了可编写逐列SQL语句的DAO代码。
事情是这样的:
UPDATE LocalTable
SET LocalTable.Field1 = DownloadTable.Field2, LocalTable.Updated = DownloadTable.Updated
WHERE LocalTable.Field1 <> DownloadTable.Field2
现在,很明显,在WHERE子句中有比这更复杂一些(你必须处理空值,你必须使用正确的格式标准对于数据类型,即,分别用“”和##代表文本和日期,数字数据没有分隔符),但编写代码很容易。
骨架代码看起来是这样的:
Dim db As DAO.Database
Dim rsFields As DAO.Recordset
Dim fld As DAO.Field
Dim strSQL As String
Set rsFields = db.OpenRecordset("SELECT TOP 1 Field1, Field2, Field3 FROM LocalTable;")
For Each fld in rsFields
[write your SQL statement and execute it]
Next fld
Set fld = Nothing
rsFields.Close
Set rsFields = Nothing
Set db = Nothing
现在,正如我所说的,复杂的部分是写为每个SQL语句的WHERE子句,但是这很容易弄清楚。另外,请注意,在您的rsFields记录集(仅用于遍历要更新的字段)中,您只想包含可更新的字段,因此您将忽略CREATED字段和PK字段(以及任何其他字段,你不想更新)。
现在,为DELETES。
您可能认为简单地删除本地表中不在远程表中的任何记录是个好主意。如果它真的是一个从属数据库,那很好,但是最初的奴隶往往最终会得到它自己的编辑。那么,在这种情况下,你需要而不是从主MySQL数据库中删除记录,而是有一个删除标记,标记记录被删除。你可以有不同种类的逻辑,可以将已删除的记录清理出主数据库(例如,如果您在记录中使用日期戳记,则可以删除标记为LastUpdated timestamp的所有记录,即< =上次您记录的记录转储数据;或者,您可以让Access应用程序将文本文件发送到服务器,并使用已从Access数据存储中成功删除的记录列表)。如果Access数据存储中存在编辑,那么您需要一些逻辑来处理从MySQL“master”数据库中删除的记录中的编辑。
总结:
如果你有一个真正的主/从关系,这是相当琐碎。如果你真的想要通过强力执行,你只需将所有MySQL数据表的全部内容转储为文本文件,删除Access数据存储区中的所有记录并导入文本文件。
我倾向于不这样做,因为你第一次需要离开纯粹的主/从关系时,你会受到影响,不得不从头开始重写所有的东西。
我给出的上述提纲对于主/从机工作非常干净,但如果您有几个专用于“从机”数据库的字段或从机中存在的数据,而不是主人(这是我正在处理的情况)。