比较不同类型的两个数据库表并比较其数据的最佳方法?

时间:2011-09-02 16:46:34

标签: php mysql sql-server drupal-6

我有两个数据库表,一个在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)

这就是很多db活动。如果表格类型相同会更容易,但这是我知道如何做的唯一方式。有没有更好的办法?我可以将两个结果集拉入关联数组并比较这种方式,只进行删除和创建所需的事务吗?我不确定。

2 个答案:

答案 0 :(得分:1)

根据您所使用的系统,有很多方法可以做到这一点。 我做的第一个假设是你有2个数据库,你想在这两个数据库之间同步数据 那就是MSSQL db必须从MySQL提取数据,反之亦然

使用关联数组的方法很好但是如果表中有100列呢? (在你的情况下,它不是,但方法不是未来证明) 因此要更新1行,如果有100行,则需要进行“n”列比较,然后将进行100 * n比较

看看MySQL REPLACE,INSERT INTO .. ON DUPLICATE KEY条款可能对你有帮助 - 我不知道MSSQL中是否有这样的条款

您可以执行其他操作 - 在每个数据库表中都有一个“last_updated”列 - 只要表中的列更新,就必须更新此时间戳字段

通过这种方式,您可以判断任一数据库表中的行是否已更新(通过将其与旧的时间戳值进行比较)并仅更新这些行

逻辑将在这些行中

to sync local to remote 
foreach localrow 
  get the common_id of the row 
  get the timestamp of the row 
  check if a row with this common_id exists in the remote table 
  if no then insert 
  if yes then 
    compare timestamps between local and remote row 
    if local row timestamp > remote row timestamp then update remote row 

答案 1 :(得分:0)

您可以执行基于集合的操作,而不是逐行操作。 e.g。

INSERT INTO local_table (vales)
SELECT .. FROM  remote_table
WHERE NOT EXISTS (Select ... FROM local_table WHERE remote_table.field = local_table.field and ...)

为此,您需要添加链接服务器请参阅sp_addlinkedserver。您可以创建从SQL Server到页面上列出的任何服务器的链接。这包括具有MySQL所执行的ODBC驱动程序的任何数据库。

我不知道MySQL能否做到相反。