我正在使用Oracle数据库。我们看到对服务的调用经常失败。当我查看日志时,我在表上看到以下异常
java.sql.BatchUpdateException: ORA-00001: unique constraint (DBSCHEMA.IDX_CO_DETAILS) 违反。
我已经检查了表上的索引以获取索引名称DBSCHEMA。IDX_CO_DETAILS .
它不包括任何列的(INCLUDE_COLUMN为空)。我怎么知道这个约束是干什么用的?是主键约束吗?
我们正在为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)
唯一约束强制执行唯一性。它将允许空值,与主键约束不同。
您的错误意味着您在数据库配置为显式禁止重复数据时插入重复数据。
可以通过对表运行以下查询来了解表上的约束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
是可选的。