我创建了一个使用PHP / MySQL的系统,下载大型XML数据集,解析它,然后每周将解析后的数据插入MySQL数据库。
该系统由两个结构相同的数据库组成。一个是生产数据库,一个是临时数据库,其中数据被解析并插入到第一个数据库中。
当数据插入临时数据库时,我通过插入/替换生产数据库中的数据来执行合并。到目前为止,我已经完成了上述所有工作。然后我意识到,可能已在新数据集中删除的数据将留在生产数据库中。
我需要执行检查以查看新数据是否仍在生产数据库中,如果是,则保留它,如果它不是从生产数据库中删除行,那么这些行不会留给留连。
为了论证,我们假设这两个数据库被称为database_temporary
和database_production
。
我该怎么做呢?
答案 0 :(得分:4)
如果您使用SQL进行合并,一个简单的SQL也可以执行删除:
delete from database_production.table
where pk not in (select pk from database_temporary.table)
注意:
not exists
表现优于not in
。请参阅What's the difference between NOT EXISTS vs. NOT IN vs. LEFT JOIN WHERE IS NULL?和NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL: SQL Server 示例not exists
:
delete from database_production.table p
where not exists (select 1 from database_temporary.table t where t.pk = p.pk)
表现说明:
正如@mgonzalez在该问题的评论中指出的那样,您可能希望使用时间戳列(类似于上次修改的内容)进行比较/合并,以便仅比较更改的行。这不适用于具体的删除,你不能使用时间戳进行删除,因为这行不会存在。