0

我需要一些关于 MySQL 操作的建议:

有一个数据库 A 可以产生几个表。通过查询,我从该数据库中选择了一组条目,以将这些结果复制到数据库 B 的另一个表中。现在数据库 B 中的表包含我对数据库 A 的查询结果。

例如查询是:

SELECT names.name,ages.age FROM A.names names A.ages ages WHERE ages.name = name.name;

并将这些结果复制到数据库中,BI 将运行:

INSERT INTO B.persons (SELECT name,age FROM A.names names A.age age WHERE age.name = name.name);

这是我的问题:当数据库 A 的数据发生变化时,我想对数据库 B 的表运行“更新”。因此,简单而肮脏的方法是:截断数据库 B 中的表,重新运行查询数据库 A 并将结果复制回数据库 B。

但是是否有更聪明的方法,以便只复制该查询的新结果行,并且数据库 B 中不再存在于数据库 A 中的那些条目被删除?

简而言之:有没有办法用新条目“增加”数据库 B 的表并“修剪”旧条目?

谢谢你的帮助

4

2 回答 2

1

您描述的内容听起来像是您想要复制该表。您所描述的内容没有简单的快速解决方案。您当然可以编写一些应用程序逻辑来执行此操作,但它不会那么有效,因为它必须比较每个表中的每个条目,然后相应地删除或更新。

一种解决方案是在 A 和 B 之间设置外键索引,并将更新和删除级联到 B。但这只能部分解决问题。如果在 A 中删除它们,它将删除 B 中的行,如果在 A 中更新它,它将更新 B 中的键列。但它不会更新其他列。另请注意,这将要求您的表类型为 INNODB。

另一个是使用 A 的值在 B 上运行插入,但使用

插入重复密钥更新....

这同样适用于更新,但不适用于删除。

您可以尝试设置实际的 MySQL 复制,但这可能超出了您的问题范围并且涉及更多。

最后,您可以如上所述设置外键索引并编写一个触发器,每当更新应用于 A 时,B 中的相应键行也会更新。这对您来说似乎是一个合理的解决方案,但我承认这不是最干净的。

看起来,一个小批量脚本会定期在您运行的任何环境上运行以复制表,这将是实现您正在寻找的最佳结果。

于 2013-06-14T08:53:30.543 回答
1

我会做两件事:1)确保您在数据库 B 中至少有一个整数或列的唯一组合的主键 2)使用逻辑删除而不是物理删除,即有一个布尔删除列

第 2 点确保您永远不必删除和丢失数据,您只需更新标志并在查询中放置where deleted = 0or where deleted is null

当与主键结合使用时,这意味着可以通过INSERT ... WITH DUPLICATE KEY插入新行并更新现有行来轻松处理所有内容 - 这意味着它也可以同时执行您的“删除”。

于 2013-06-14T08:55:34.050 回答