Oracle 约束冲突异常ORA-00001

Oracle 约束冲突异常ORA-00001,oracle,hibernate,indexing,ora-00001,Oracle,Hibernate,Indexing,Ora 00001,我正在使用Oracle数据库。我们的服务电话经常出现故障。当我查看日志时,我在表上看到以下异常 java.sql.BatchUpdateException:ORA-00001:违反了唯一约束(DBSCHEMA.IDX_CO_详细信息) 我已经检查了表上的索引,以了解索引名DBSCHEMA.IDX_CO_的详细信息 它没有包含任何列(include_列为空)。我怎么知道这个约束是为了什么?它是主键约束吗 我们正在使用hibernate进行ORM。下面是hibernate上下文中的回溯 Caused

我正在使用Oracle数据库。我们的服务电话经常出现故障。当我查看日志时,我在表上看到以下异常

java.sql.BatchUpdateException:ORA-00001:违反了唯一约束(DBSCHEMA.IDX_CO_详细信息)

我已经检查了表上的索引,以了解索引名DBSCHEMA.IDX_CO_的详细信息

它没有包含任何列(include_列为空)。我怎么知道这个约束是为了什么?它是主键约束吗

我们正在使用hibernate进行ORM。下面是hibernate上下文中的回溯

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)
A强化了,嗯,独特性。它将允许空值,而不是空值

您的错误意味着您在将数据库配置为显式禁止插入重复数据时插入了重复数据

通过在上运行以下查询,可以找出表上的约束。该链接对列
CONSTRAINT\U TYPE
进行解码,例如
P
是主键,
U
是唯一键

select *
  from all_constraints uc
 where uc.table_name = 'MY_TABLE'
   and owner = 'DBSCHEMA'
要找出约束中的列,请改用,或将这两个列合并到一个查询中:

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'
对于任一查询,您都可以添加附加条件
和约束名称='IDX\u CO\u DETAILS'
,以查找导致问题的特定约束的详细信息


出于几个原因,你的评论有点令人惊讶。即使是系统创建的约束(例如,在创建表时未指定名称的内联定义的约束)也应显示出来。此外,约束名称
IDX…
意味着它是一个索引

如果运行以下查询,它将告诉您数据库中是否存在该对象:

select *
  from all_objects
 where object_name = 'IDX_CO_DETAILS'
我希望这个查询返回的
对象类型是
'INDEX'

在此基础上,以下查询将返回具有该名称的每个索引、索引类型、与之关联的表以及该表的所有者

select *
  from all_indexes
 where index_name = 'IDX_CO_DETAILS'
根据您的错误判断,我进一步希望此查询返回的列
唯一性
'UNIQUE'

这将有助于跟踪对象

您还可以使用系统包跟踪对象的DDL;小心,它会返回clob

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

参数
schema
是可选的。

我已经运行了这两个查询。我删除了所有者,因为它没有返回任何行。所有约束都没有名称IDX_CO_DETAILS,也没有唯一的键约束。它可能是oracle为主键创建的索引约束吗?是的,它存在于all_index表中。但当我运行最后一次dbms_元数据查询时,我得到了object not found错误。我们有另一个内部工具来获取表元数据。发现IDX_CO_详细信息基于三列。因此,在创建索引时,它应该失败。那么,在索引上而不是在表本身上添加约束有意义吗?。在本例中,我们得到了JDBC批处理更新异常。如果我们对表而不是索引有约束,这能避免吗?如果索引定义为唯一的,它就有一个与之相关联的唯一约束;i、 e.默认情况下,它被约束在表上。在
all\u constraints
或使用
dbms\u metadata
中找不到它的事实相当可疑;该表是否与您从中查询这些数据的模式相同?使用唯一约束/索引的原因是为了避免重复并加快查询速度。如果存在约束的有效原因,则更新表的代码是不正确的,而不是约束本身。我可以在所有_约束中找到它,我使用的是正确的模式。关于最后一点>>如果约束存在有效原因,则更新表的代码不正确,而不是约束本身。这怎么可能是代码的问题,数据库应该通过异常处理,在这种情况下,代码如何处理它?你指的是hibernate映射文件吗?对不起,我不是故意暗示代码是错误的;更重要的是,如果约束是出于某种原因,那么您应该重新考虑为什么要进行更新/插入。