Poo*_*rna 3 oracle indexing hibernate ora-00001
我正在使用Oracle数据库.我们看到我们的服务电话频繁失败.当我查看日志时,我看到桌子上有例外情况
java.sql.BatchUpdateException:ORA-00001:违反了唯一约束(DBSCHEMA.IDX_CO_DETAILS).
我已经检查了表中索引名称DBSCHEMA.IDX_CO_DETAILS的索引.
它不包含任何列(INCLUDE_COLUMN为null).我怎么知道这个约束是什么?它是主键约束吗?
我们正在使用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)
Run Code Online (Sandbox Code Playgroud)
Ben*_*Ben 12
一个独特的约束强制执行,那么,唯一性.与主键约束不同,它将允许空值.
您的错误意味着当数据库配置为明确禁止时,您正在插入重复数据.
您可以通过在all_constraints上运行以下查询来找出表上的约束.该链接对列CONSTRAINT_TYPE
进行解码,例如P
是主键和U
唯一键.
select *
from all_constraints uc
where uc.table_name = 'MY_TABLE'
and owner = 'DBSCHEMA'
Run Code Online (Sandbox Code Playgroud)
要找出约束中使用的列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'
Run Code Online (Sandbox Code Playgroud)
要查询,您可以添加其他条件and constraint_name = 'IDX_CO_DETAILS'
以查找似乎导致问题的特定约束的详细信息.
由于几个原因,您的评论有点令人惊讶.甚至系统创建的约束,例如,在创建表而没有指定名称的情况下在线定义的约束应该显示出来.此外,约束名称IDX...
意味着它是一个索引.
如果您运行以下查询,它应该告诉您数据库中是否存在该对象:
select *
from all_objects
where object_name = 'IDX_CO_DETAILS'
Run Code Online (Sandbox Code Playgroud)
我希望OBJECT_TYPE
这个查询返回的是'INDEX'
.
接下来,以下查询将返回具有该名称的每个索引,索引的类型,与其关联的表以及该表的所有者.
select *
from all_indexes
where index_name = 'IDX_CO_DETAILS'
Run Code Online (Sandbox Code Playgroud)
根据您的错误判断,我还希望UNIQUNESS
此查询返回的列是'UNIQUE'
.
这应该可以帮助您追踪对象.
您还可以使用系统包dbms_metadata
来跟踪对象的DDL; 小心它会返回一个clob.
select dbms_metadata.get_ddl('INDEX','IDX_CO_DETAILS', schema => 'DBSCHEMA')
from dual
Run Code Online (Sandbox Code Playgroud)
参数schema
是可选的.
归档时间: |
|
查看次数: |
34625 次 |
最近记录: |