客户的一张表中出现重复数据,而该列由唯一键约束,重复值如何产生的呢?

简介: 批量加载数据时要小心,唯一键、索引可能会失效

oraclebulkcopy:https://docs.oracle.com/html/E10927_01/OracleBulkCopyClass.htm#CHDHHABB

1、问题

客户的一张表中出现重复数据,而该列由唯一键约束,重复值如何产生的呢?
事情的起因是客户遇到ORA-02291外键问题,外键更新列没有找到主表中的列值,由业务去排查,但是通过这个问题进一步发现了业务的重复数据的潜在问题,
及时调整避免长期运行造成更大的问题。
报错如下:
ORA-02291: integrity constraint (ERP_CC.T_ECHDA_T_EZBQGDA_FK1) violated - parent key not found
ORA-06512: at "ERP_CC.UPDATET_ECHDABYT_TMH_PROC", line 346
ORA-06512: at line 1
检查该表的DDL,截取问题部分如下,发现唯一键unusable,一个外键disable,但不是ORA-02291对应的外键,
1

进一步排查,发现唯一键YBH28 包含3307条重复数据,这是怎么产生的呢?唯一索引状态还是unusable的。

2、排查

从客户近期的业务调整得知,业务新改动了加载数据的方法,使用了oraclebulkcopy的方式加载数据,insert语句出现 /+ SYS_DL_CURSOR / hint,
该hint就是SQL Loader的方式, 相当于sqlldr(direct=true)直接路径加载,会导致索引失效,因此Bulkcopy需要谨慎使用,要性能的时候要考虑重复数据如何避免。
2

3、解决

问题根源找到了,修改加载数据的方法,同时业务去处理重复数据,重新加一下唯一键,失效的外键启用,外键插入引起的ORA-02291问题业务上去检查避免。

4、总结

oraclebulkcopy对应的实现是sqlloader加载数据,有如下限制:
1、会disbale索引
2、direct=true模式加载数据,表的约束会在过程中失效
3、对表加排它锁。

SQL*Loader leaves indexes in an Index Unusable state when the data segment being loaded becomes more up-to-date than the index segments that index it.
Any SQL statement that tries to use an index that is in an Index Unusable state returns an error. The following conditions cause a direct path load to leave an index or a partition of a partitioned index in an Index Unusable state:

* SQL*Loader runs out of space for the index and cannot update the index.
* The data is not in the order specified by the SORTED INDEXES clause.
* There is an instance failure, or the Oracle shadow process fails while building the index.
* There are duplicate keys in a unique index.
* Data savepoints are being used, and the load fails or is terminated by a keyboard interrupt after a data savepoint occurred.

参考文档:
https://docs.oracle.com/cd/B28359_01/server.111/b28319/ldr_modes.htm#i1010480

相关文章
|
机器学习/深度学习 存储 SQL
全栈开发之MySQL主从同步,读写分离后可能引发的问题
全栈开发之MySQL主从同步,读写分离后可能引发的问题
640 0
全栈开发之MySQL主从同步,读写分离后可能引发的问题
|
5月前
|
机器学习/深度学习 编解码 人工智能
快手封号怎么申诉才能成功?
快手封号申诉技术解析
|
10月前
|
机器学习/深度学习 编解码 BI
YOLOv11改进策略【Conv和Transformer】| CVPR-2023 BiFormer 稀疏自注意力,减少内存占用
YOLOv11改进策略【Conv和Transformer】| CVPR-2023 BiFormer 稀疏自注意力,减少内存占用
415 3
YOLOv11改进策略【Conv和Transformer】| CVPR-2023 BiFormer 稀疏自注意力,减少内存占用
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
326 2
|
人工智能 编解码 API
【选择”丹摩“深入探索智谱AI的CogVideoX:视频生成的新前沿】
【选择”丹摩“深入探索智谱AI的CogVideoX:视频生成的新前沿】
290 1
|
监控 安全 物联网
物联网卡应用中一些常见限制
物联网卡(IoT SIM卡)在实际应用中,除了APN配置的多样性外,还受到多种限制和约束。这些限制通常与网络运营商的政策、服务条款、技术实现以及安全需求紧密相关。以下是一些常见的物联网卡限制:
|
传感器 数据可视化 网络协议
DIY可视化整合MQTT生成UniApp源码
DIY可视化整合MQTT生成UniApp源码
244 0
|
SQL JSON 关系型数据库
SqlAlchemy 2.0 中文文档(七十五)(1)
SqlAlchemy 2.0 中文文档(七十五)
316 4
|
域名解析 缓存 网络协议
理解DNS的重要性与影响
【8月更文挑战第24天】
541 0