ORA-00001: unique constraint (...) violated并不一定是数据冲突

本文解决了一个在数据库表中插入数据时遇到的ORA-00001错误,通过分析发现该错误并非由数据重复引起,而是由于表结构及索引存在问题导致。最终通过重建表和索引解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文链接:http://blog.163.com/jet_it_life/blog/static/205097083201301410303931/


收到一位测试人员RAISE的JIRA,说在某张表上INSERT不了数据,报ORA-00001: unique constraint violated的错误,但是仔细核查了一下,并没有发现有重复的数据,让帮忙检查一下是什么问题。
仅仅看错误,应该是数据冲突引起的。但有一点比较奇怪的是错误中提示的违反的约束是一个索引,而这个索引并不是唯一索引!将这个索引DROP后,ORA-00001依然存在,但是这次换了一个索引!而这个索引依然不是唯一索引!再将这个索引DROP后再进行INSERT,问题的本质就暴露出来了:
ERROR at line 1:
ORA-00600: internal error code, arguments: [6002], [0], [227], [2], [0], [], [], []
600的错误,可能是表或表上的索引数据有坏块或者表或表的索引结构存在问题,尝试分析表及索引的结构:
SQL> ANALYZE TABLE #.# VALIDATE STRUCTURE CASCADE;
ANALYZE TABLE #.# VALIDATE STRUCTURE CASCADE
*
ERROR at line 1:
ORA-01499: table/index cross reference failure - see trace file
已经基本可以确定问题在表结构及其索引,尝试对表及相关索引进行重建:
SQL> alter TABLE #.# move;

Table altered.
SQL> alter index #.# REBUILD;

Index altered.
...
重建完表和索引后,终于正常INSERT了。

================================================================

关于ANALYZE的用法参考http://blog.sina.com.cn/s/blog_682841ba0101bncp.html

这段报错是由于执行数据库更新操作时出现了唯一约束冲突引起的。具体报错信息如下: ``` Error updating database. Cause: java.sql.SQLIntegrityConstraintViolationException: ORA-00001: unique constraint (TPMDATA.EMS_M_DOC_HEAD_PK) violated The error may exist in URL [jar:file:/home/itks_mgt/TPM/tpm.jar!/BOOT-INF/classes!/mybatis/business/EmsMDocHeadMapper.xml] The error may involve com.ruoyi.project.business.mapper.EmsMDocHeadMapper.insertEmsMDocHead-Inline The error occurred while setting parameters SQL: insert into tpmdata.ems_m_doc_head ( mt_no, plant_id, start_date, end_date, begin_time, begin_by, status, doc_type, planner_group, schedule_id ) values ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) Cause: java.sql.SQLIntegrityConstraintViolationException: ORA-00001: unique constraint (TPMDATA.EMS_M_DOC_HEAD_PK) violated ORA-00001: unique constraint (TPMDATA.EMS_M_DOC_HEAD_PK) violated nested exception is java.sql.SQLIntegrityConstraintViolationException: ORA-00001: unique constraint (TPMDATA.EMS_M_DOC_HEAD_PK) violated ``` 其中,报错的原因是由于 `java.sql.SQLIntegrityConstraintViolationException` 引发的,该异常表示违反了数据库的完整性约束。具体的约束名称是 `TPMDATA.EMS_M_DOC_HEAD_PK`,这是一个唯一约束(unique constraint)。报错的SQL语句是一个插入语句,向表 `tpmdata.ems_m_doc_head` 插入数据,但插入的数据违反了该唯一约束。 总结起来,报错的原因是在插入数据时,违反了表 `tpmdata.ems_m_doc_head` 的主键约束,该主键约束要求插入的数据在某个字段上必须是唯一的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值