gpt4 book ai didi

php - 比较两个不同类型的数据库表并比较它们的数据的最佳方法?

转载 作者:行者123 更新时间:2023-11-29 00:53:22 30 4
gpt4 key购买 nike

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

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

最佳答案

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

您使用关联数组的方法很好,但如果表中有 100 列怎么办? (在你的情况下不是,但这种方法不是 future 的证明)所以要更新 1 行你需要进行“n”列比较如果有 100 行,那么将有 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

关于php - 比较两个不同类型的数据库表并比较它们的数据的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7286697/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com