我有两个数据库表,一个在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活动。如果表格类型相同会更容易,但这是我知道如何做的唯一方式。有没有更好的办法?我可以将两个结果集拉入关联数组并比较这种方式,只进行删除和创建所需的事务吗?我不确定。
答案 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能否做到相反。