约束冲突异常ORA-00001(Constraint Violation Exception ORA

2019-07-29 20:35发布

我使用Oracle数据库。 我们在呼吁我们的服务中经常出现故障。 当我看着我在桌子上看到以下例外日志

java.sql.BatchUpdateException:ORA-00001:唯一约束(DBSCHEMA.IDX_CO_DETAILS)侵犯。

我已经检查了索引名DBSCHEMA.IDX_CO_DETAILS表上的索引。

它不包含任何列的(INCLUDE_COLUMN为空)。 我怎么能知道这是什么约束呢? 它是主键约束?

我们使用Hibernate的ORM。 下面是在休眠情况下回溯追踪

Caused by: org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:94)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266)
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167)
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50)
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027)
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:365)

Answer 1:

一个独特的约束强制执行,那么,唯一性。 这将允许为空,不像一个主键约束 。

你的错误意味着你插入重复数据时,数据库已经被配置为明确禁止这一点。

你可以找出制约因素是什么在桌子上通过运行下面的查询ALL_CONSTRAINTS 。 链路解码柱CONSTRAINT_TYPE ,例如P是主键和U唯一密钥。

select *
  from all_constraints uc
 where uc.table_name = 'MY_TABLE'
   and owner = 'DBSCHEMA'

要找出是什么列约束使用all_cons_columns代替,或两者结合成一个查询:

select uc.*, ucc.column_name, ucc.position
  from all_constraints uc
  join all_cons_columns ucc
    on uc.owner = ucc.owner
   and uc.table_name = ucc.table_name
   and uc.constraint_name = ucc.constraint_name
 where uc.table_name = 'MY_TABLE'
   and uc.owner = 'DBSCHEMA'

要么查询,您可以添加额外的条件and constraint_name = 'IDX_CO_DETAILS'找出这似乎是造成您的问题具体约束的细节。


您的评论是有两个原因有点令人惊讶。 即使是系统创建的约束,例如一个在线的定义时,该表是不被指定应显示的名称创建的。 此外,约束名IDX...意味着这是一个索引。

如果您运行下面的查询,如果在数据库中存在的对象时,它应该告诉你:

select *
  from all_objects
 where object_name = 'IDX_CO_DETAILS'

我希望的是, OBJECT_TYPE此查询返回的'INDEX'

从下面的查询将返回各指标与该名继,指数型,表与其关联和表的所有者。

select *
  from all_indexes
 where index_name = 'IDX_CO_DETAILS'

通过你的错误来看我进一步想到的是,列UNIQUNESS此查询返回是'UNIQUE'

这会帮助你跟踪的对象。

您还可以使用系统包dbms_metadata追查对象的DDL; 要小心,它返回一个CLOB。

select dbms_metadata.get_ddl('INDEX','IDX_CO_DETAILS', schema => 'DBSCHEMA') 
  from dual

参数schema是可选的。



文章来源: Constraint Violation Exception ORA-00001