扩充和修剪MySQL表

时间:2013-06-14 08:04:27

标签: mysql select copy

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

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

例如,查询是:

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

要将这些结果复制到数据库B,我会运行:

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表并“删除”旧条目?

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

您所描述的内容听起来像是要复制表格。对于您描述的内容,没有简单的快速修复方法。您当然可以编写一些应用程序逻辑来执行此操作,但它不会像在每个表中比较每个条目然后相应地删除或更新那样高效。

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

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

INSERT ON DUPLICATE KEY UPDATE ....

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

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

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

似乎一个小批量脚本定期运行,在这个环境中运行复制表的环境最适合实现您的目标。

答案 1 :(得分:1)

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

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

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