mysql - 删除数据库中没有引用的条目

标签 mysql sql-server database

我们有以下要求:

目前,我们将数据从源(另一个服务器、另一个团队、另一个数据库)获取到临时数据库(通过批处理作业),在将数据获取到临时数据库后,我们处理数据、转换和更新我们的主数据库存在差异的数据库(即发生更改的记录或新添加的记录)。

源->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/

相关文章:

php - 使用 Stunnel 通过 Web 服务器向 MySQL 服务器提交表单数据?

php - 比通常的 phpagi 运行时间更长

sql-server - 如何检查是否启用了更改跟踪

php - 为什么我的数组值在我的数据库中被截断了?

mysql - 将 DATE 字段的范围与 MySQL 中的 CURDATE() 进行比较,而不考虑年份

database - 设计高性能社交提要的概念

python - 一个模型如何可以有多个键,并以相同类型的模型作为值?

php - 如何根据第一个条件结果对 Laravel 查询构建器进行排序

sql - 一天中的所有时间

c# - 对 SQL 2005 中的程序集使用 WITH PERMISSION_SET = UNSAFE 不好吗?