如何检查数据库中是否已存在一组行并跳过迁移?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何检查数据库中是否已存在一组行并跳过迁移?相关的知识,希望对你有一定的参考价值。
我需要创建一个包来将大量数据从数据库表迁移到不同的数据库表。源表将持续在4,5天内获得新数据,因此我将一次又一次地运行我的包。
我需要将此表中的所有数据迁移到另一个表,但我不想迁移已迁移的那些数据。我需要使用什么样的转换或者我需要编写哪些SQL命令才能执行此操作?
通常的方法是在源表上设置“audit”时间戳,并仅迁移在上次迁移后更新或插入的记录。
例如:
Table Sales
sale_id
sale_date
sale_amount
...............
dw_create_date
dw_update_date
你的源提取可能是......
select sales.sale_id,
sales.sale_date,
....
from sales
where dw_updated_date > {last_migration_date}
last_migration_date通常从配置文件或表中读取。
其他方法
您可以使用其他一些方法,但随着数据大小的增加,所有这些方法都会出现更大的性能问题。
1)执行(目标 - 源)数据,以获取源中已更改的行。
select *
from source
minus
select * from target
您可以使用源和目标之间的连接执行相同的操作。
select source。* from src left join tgt on(src.id = tgt.id)where(src.column1 <> tgt.column1或src.column2 <> tgt.column2 ............ )
请注意,这些方法中的任何一种都不会处理源中的删除。如果您希望表同步,那么唯一的方法是执行(source-target)获取插入/更新更改和(target-source)获取已删除的行并在目标中执行相同操作。
2.插入并忽略主要约束错误:
如果数据可以在源中更改并且您希望更新传播到目标,则会出现严重问题。您每次都要查询整个源代码。通常,最好使用Merge / Upsert和过滤后的源数据。
我会假设两个表都有一些唯一的标识符,不是吗?
表A具有:1 2 3 4
您正在将其移至表B,但同时保留表A中的数据,是吗?
所以你已经完成了一次工作。现在表B有:1 2 3 4
表A得到更新。它现在有:1 2 3 4 5 6 7
你再次运行你的工作,但你只想发送超过5,6,7。
SELECT *
FROM TableA
LEFT OUTER JOIN TableB ON TableA.ID = TableB.ID
WHERE TableB.ID = NULL.
如果你有一些样本数据,它会有所帮助。这会给你一个好主意吗?
见加入:http://i.stack.imgur.com/1UKp7.png
以上是关于如何检查数据库中是否已存在一组行并跳过迁移?的主要内容,如果未能解决你的问题,请参考以下文章
如何确定一个值是不是在使用 Dplyr 的一组行中出现最多? [复制]