Oracle 用merge into 解决插入重复数据问题

本文介绍如何使用Oracle的mergeinto语句解决数据重复插入的问题。通过创建临时表接收新增数据,并利用mergeinto判断并插入非重复数据,实现了高效的数据管理。
部署运行你感兴趣的模型镜像

Oracle 用merge into 解决插入重复数据问题

继昨天解决用python向oralce插入数据问题,今天考虑到我插入的数据每次都是包含前一次插入的数据,太多重复值不利于之后的数据可视化,所以想着能不能插入数据的时候自动判别重复的值,只导入不重复的值,一开始用
install into a where a.t not in (select t from a )
结果报错,百度才知道install不能直接跟where,查询好久发现好多都指向用merge into,于是直接去搜了它的用法,感觉可行,就试着让表自己和自己去重,仔细想了一下发现逻辑上行不通,就想到建一个临时表,每次新增数据用python插入到临时表中,再用merge into 将临时表中不重复的插入最终表中

merge into  table1 a 
using table_temp b 
on(a.col = b.col)
when not matched then 
insert(col1,col2)--表a的所有列名 
values(b.col1,b.col2) --表b的所有列名

个人对merge into在本次需求中的理解:
table1 就是需要插入的表
table_temp 就是我的临时表,也就是需要将这个表里的数导入到需要被插入的表中
on 两个表中有代表意义唯一的值,例如学生id
when not matched then 当表b中数没有和表a匹配上时,也就是说此时我的临时表中的数和表a匹配后,将相同的数剔除剩余不同的部分
insert(col1,col2) 将上面提到的剩余不同的数插入a表中,这里的insert括号里是指a表的列名,全部列出来,不列出来会怎么样,还没测试过
values(b.col1,b.col2)这里需要列出的是临时表表b的所有列名
最后通过先清空临时表,再将爬取到的数插入临时表中,再将临时表中的数通过merge into 插入最终表中,成功实现用python去重插入,特此记录一下,merge into还可以进行删改操作,因为本次需求中未用到,等之后有需求再学习使用。
最近越来越发现已用促学才能更快学习掌握,至少不盲目,每天进步一点点,时间宝贵,且学且珍惜!

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

在使用 Oracle 的 `MERGE INTO` 语句进行数据插入或更新时,出现重复数据的原因通常与源表(即 `USING` 子句中的表)的结构、匹配条件(`ON` 子句)的设计以及目标表的数据状态有关。以下是详细分析和解决方法: ### 插入重复数据的原因 1. **源表中存在重复记录** 如果 `USING` 子句中的源表包含多条与目标表匹配条件相同的记录,则 `MERGE INTO` 在执行过程中会尝试对同一个目标行进行多次插入或更新操作,从而导致错误或数据不一致的情况。Oracle 不允许这种行为,因此会抛出类似以下错误信息: > MERGE语句多次尝试更新或删除相同的行 [^2]。 2. **匹配条件设计不当** 如果 `ON` 子句中的匹配条件不够精确,可能导致源表中的多个记录与目标表中的单条记录匹配,进而引发插入冲突或更新冲突的问题。 3. **未考虑目标表已有数据的状态** 如果目标表中已经存在部分数据,而源表没有过滤掉这些已存在的数据,则可能造成重复插入,尤其是在没有正确设置 `WHEN NOT MATCHED` 条件的情况下。 4. **未处理源表中的重复项** 源表本身可能存在重复数据,若未在合并前进行去重处理,直接用于 `MERGE INTO` 操作将导致插入失败或数据冗余 [^4]。 --- ### 解决方法 1. **确保源表无重复数据** 在使用 `MERGE INTO` 前,应对源表进行去重处理。可以使用 `DISTINCT` 或 `GROUP BY` 对源表进行预处理,以避免多个源记录匹配到同一个目标记录。 ```sql MERGE INTO target_table t USING ( SELECT DISTINCT col1, col2, col3 FROM source_table ) s ON (t.col1 = s.col1 AND t.col2 = s.col2) WHEN NOT MATCHED THEN INSERT (col1, col2, col3) VALUES (s.col1, s.col2, s.col3); ``` 2. **优化匹配条件** 精确设计 `ON` 子句,确保每条源记录最多只匹配一条目标记录。例如,可以结合主键或唯一约束字段作为匹配条件,提高匹配准确性 [^4]。 3. **使用 GROUP BY 进行聚合处理** 如果源表中确实需要保留多个记录但逻辑上属于同一组,可以通过 `GROUP BY` 聚合数据后再进行合并操作。 ```sql MERGE INTO target_table t USING ( SELECT col1, MAX(col2) AS col2, MAX(col3) AS col3 FROM source_table GROUP BY col1 ) s ON (t.col1 = s.col1) WHEN NOT MATCHED THEN INSERT (col1, col2, col3) VALUES (s.col1, s.col2, s.col3); ``` 4. **临时表与最终表分离操作** 可以先将新增数据插入到一个临时表中,然后通过 `MERGE INTO` 将临时表中的数据合并到最终表中,这样可以有效控制源数据的质量并减少对主表的直接操作风险 [^1]。 5. **使用唯一索引或主键约束** 在目标表上建立合适的唯一索引或主键约束,可以防止重复数据插入。即使 `MERGE INTO` 没有显式去重,数据库也会自动拒绝重复插入请求,从而保证数据一致性 [^5]。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值