我们有以下要求:
目前,我们将数据从源(另一个服务器、另一个团队、另一个数据库)获取到临时数据库(通过批处理作业),在将数据获取到临时数据库后,我们处理数据、转换和更新我们的主数据库存在差异的数据库(即发生更改的记录或新添加的记录)。
源->tempDB(每日重新创建)->delta->primaryDB
要求: - 一旦在源中删除数据,就删除主数据库中的数据。 例如:假设在源中创建了一条 ID=1 的记录,它到达临时数据库并最终到达主数据库。当这条记录在源中被删除时,它也应该在主数据库中被删除。
挑战: 当临时数据库中没有任何内容可引用时,我们如何从主数据库中删除(因为该记录已在源中删除,所以临时数据库中没有任何内容)。
天真的方法: - 我们可以在每次转换和重新加载之前清理主数据库。但是,每次清理和填充主数据库都需要花费大量时间。
最佳答案
您可以在每个用已删除条目填充历史表的表上创建触发器。将其同步到您的 tempDB 并使用它来删除主数据库中的内容。
您要么需要每个表一个“删除历史表”,要么需要一个还包含触发删除的表名的组合历史表。
您可能需要研究 SQL Compare 或其他工具来同步表。
如果您可以同时访问 tempDB 和 primeDB(同一服务器或链接服务器),您也可以尝试
delete *
from primeBD.Tablename
where not exists (
select 1
from tempDB.Tablename where id = primeDB.Tablename.Id
)
这会表现得很糟糕 - 问问你的数据库设计者。
关于mysql - 删除数据库中没有引用的条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46954874/