所以,我有两个mysql db表:“table\u original”和“table\u copy”
以下是我当前的设置:
每天晚上, table_original
从另一个服务器更新信息。它要么删除旧的db行,要么为它添加一个具有唯一post\u id的新行(即使删除了行,也不会有两个相同的post\u id)。
然后,某些信息连同post\u id一起被复制到 table_copy
. 因此,两者通过 post_id
.
到目前为止 table_original
有20000行 table_copy
大约有40000人。
我注意到了 table_copy
尚未从第一个表中更新,但只添加了行,而没有删除从第一个表中删除的任何内容。
为了同步它们,我最初的方法是检查 table_original
反对 table_copy
如果post\u id存在,则不执行任何操作,如果不存在,则从 table_copy
.
我担心的是 table_original
每晚更新:旧的post\u id行将被删除和/或添加新行。不幸的是,我没有办法在做之前知道正在做什么。意思是,我必须等到数据库更新后才能看到删除和添加了什么。
然后,每次更新第一个表时,我都要对照第二个表检查每一行以更新它们。table只会越来越大,我担心这种方法可能不是最好的。
你们建议我怎么办?
谢谢!
1条答案
按热度按时间thtygnil1#
要删除表\u copy中不在表\u original中的行,请执行以下操作:
我建议您创建一个包含几行的虚拟表,这样您就可以尝试使用这种查询,并在对实际数据运行它之前增加对它的信心!
看到了吗http://dev.mysql.com/doc/refman/5.7/en/delete.html 有关多表delete语句的更多文档。
要使它们每晚自动同步,请使用触发器:
看到了吗http://dev.mysql.com/doc/refman/5.7/en/create-trigger.html
请回复您的意见:
知道哪些post\u id被删除是很棘手的。由于它们已不在数据库中,您需要:
如果您发现仍在数据库中的post\u id值之间存在差距,则可以推断它们曾经存在。但这并不能保证,因为如果插入失败,可能永远不会使用id值。
检查某种日志。有些人使用触发器附加到审计表。或者编写删除日志的应用程序来创建日志。
使用mysqlbinlog工具通读删除事件。这有点先进。