所以,我有两个mysql数据库表:" table_original"和" table_copy"
这是我目前的设置:
每晚,table_original
都会从另一台包含信息的服务器进行更新。它要么删除旧的db行,要么添加一个带有唯一post_id的新行(即使删除了行,也不会有两个相同的post_id)。
然后,将某些信息与post_id一起复制到table_copy
。因此,两个由post_id
链接。
到目前为止,table_original
有~20,000行,而table_copy
有~40,000。
我刚刚注意到table_copy
尚未从第一个表中更新,但只是添加了行而不是删除从第一个表中删除的任何内容。
为了同步它们,我的初始方法是从table_original
检查table_copy
的每一行,如果post_id存在,则不执行任何操作,如果没有,则从{{1}中删除行}}
我担心的是,table_copy
每晚都会更新:较旧的post_id行将被删除和/或添加新行。不幸的是,在完成之前我无法知道正在做什么。意思是,我必须等到db更新才能看到删除和添加的内容。
然后,每次更新第一个表时,我都必须检查第二个表的每一行以更新它们。该表只会变得更大,我担心这种方法可能不是最好的。
你们有什么建议我可以做的?
谢谢!
答案 0 :(得分:3)
删除table_copy中table_original中不存在的行:
DELETE t1.* FROM table_copy AS t1
LEFT OUTER JOIN table_original AS t2 USING (post_id)
WHERE t2.post_id IS NULL;
我建议您创建一个包含几行的虚拟表,以便您可以尝试使用此类查询,并在针对实际数据运行之前提高您的信心!
有关多表DELETE语句的更多文档,请参阅http://dev.mysql.com/doc/refman/5.7/en/delete.html。
要让它们每晚自动保持同步,请使用触发器:
CREATE TRIGGER copy_on_ins AFTER INSERT ON table_original
FOR EACH ROW
INSERT INTO table_copy SET post_id = NEW.post_id, other_columns = NEW.other_column;
CREATE TRIGGER copy_on_upd AFTER UPDATE ON table_original
FOR EACH ROW
UPDATE table_copy SET other_column = NEW.other_column
WHERE post_id = NEW.post_id;
CREATE TRIGGER copy_on_del AFTER DELETE ON table_original
FOR EACH ROW
DELETE FROM table_copy WHERE post_id = OLD.post_id;
请参阅http://dev.mysql.com/doc/refman/5.7/en/create-trigger.html
重新评论:
知道哪些post_id被删除是棘手的。由于它们不再存在于数据库中,您需要: