【发布时间】:2011-09-02 16:46:33
【问题描述】:
我有两个数据库表,一个在 MYSQL,一个在 MSSQL。两者都有相似的数据,一个基于另一个数据。它们位于两个不同的数据库中,因为一个是管理的远程系统,而本地系统是 Drupal 安装,我使用它通过自定义模块以更友好的方式显示数据。
例如,我在 MSSQL 中有一个这种结构的表:
ID | Title | Description | Other fields I don't care about
基于从该表中提取数据,我在 MYSQL 中生成了一个表:
local_id | remote_id | title | description
当模块初始化时,它会从 MSSQL 表中进行选择并生成记录并填充本地数据库。 Remote_id 是 MSSQL 数据库中的 ID 字段,因此我们可以将两条记录一起引用。
我需要同步这些数据,在本地删除远程表上不再存在的记录并创建本地不存在的新记录,并更新所有行信息。
问题是,这需要至少 2 个不同的事务以及可能的逐行事务。示例:
将本地同步到远程并删除不存在的远程记录:
Select remote_id from local_table;
For Each remote_id ( select ID, title, description FROM remote_table where ID = remote_id )
If record exists
UPDATE local_table WHERE remote_id = row_id
Else
DELETE FROM local_table where remote_id = row_id
那么我们至少需要一个其他事务来获取新记录(如果我在上一个循环中没有这样做,我也可以在这里更新):
Select ID, title, description from remote_table;
For each ID ( Select remote_id from local_table )
If does not exist
INSERT INTO local_table (VALUES)
所以这是很多数据库活动。如果表格是相同的类型会更容易,但这是我知道如何做到这一点的唯一方法。有没有更好的办法?我可以将两个结果集都拉到一个关联数组中并以这种方式进行比较,并且只执行删除和创建所需的事务吗?我不确定。
【问题讨论】:
-
为什么不直接查询远程数据库?
-
我不确定你的意思,纳尔夫。我需要同时查询远程和本地数据库来比较两者。我正在寻找最有效的方法。
-
我的意思是你为什么要获取表的本地副本?很明显,您可以直接远程访问它...
-
@Narf - 我正在尝试将远程数据引入 drupal 安装。为了创建节点,它必须将远程数据带入本地数据库并将它们保存为节点。我需要将远程行与我当前在站点上创建的节点进行比较,并相应地编辑或删除它们。我可以直接访问数据库(我现在正在这样做),但它限制了在 drupal 系统中执行操作的能力,除非您将数据作为节点引入。
标签: php mysql sql-server drupal-6