首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >约束违反例外ORA-00001

约束违反例外ORA-00001
EN

Stack Overflow用户
提问于 2012-06-10 22:54:49
回答 1查看 38.8K关注 0票数 3

我使用的是Oracle数据库。我们看到对我们服务的调用经常失败。当我查看日志时,我在一个表上看到了以下异常

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

我已经在表中检查了索引名称DBSCHEMA.IDX_CO_DETAILS的索引。

它不包括任何列的( INCLUDE_COLUMN为null)。我如何知道这个约束是用来做什么的?它是主键约束吗?

我们使用hibernate进行ORM。下面是hibernate上下文中的反向跟踪

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-10 23:07:24

unique constraint强制执行,嗯,唯一性。它将允许空值,这与primary key constraint不同。

您的错误意味着您正在插入重复数据,而数据库已配置为显式禁止此操作。

通过在all_constraints上运行以下查询,可以找出表上的约束是什么。链接解码列CONSTRAINT_TYPE,例如P是主键,U是唯一键。

代码语言:javascript
复制
select *
  from all_constraints uc
 where uc.table_name = 'MY_TABLE'
   and owner = 'DBSCHEMA'

要找出约束中有哪些列,请改用all_cons_columns,或者将两个列组合到一个查询中:

代码语言:javascript
复制
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...意味着它是一个索引。

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

代码语言:javascript
复制
select *
  from all_objects
 where object_name = 'IDX_CO_DETAILS'

我希望这个查询返回的OBJECT_TYPE'INDEX'

接下来,下面的查询将返回具有该名称的每个索引、索引类型、与其关联的表以及该表的所有者。

代码语言:javascript
复制
select *
  from all_indexes
 where index_name = 'IDX_CO_DETAILS'

根据您的错误判断,我还认为这个查询返回的列UNIQUNESS'UNIQUE'

这应该可以帮助你追踪到物体。

您还可以使用系统包dbms_metadata来跟踪对象的DDL;请注意它会返回一个clob。

代码语言:javascript
复制
select dbms_metadata.get_ddl('INDEX','IDX_CO_DETAILS', schema => 'DBSCHEMA') 
  from dual

参数schema是可选的。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10969693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档