当前位置: 首页 > 面试题库 >

约束违例异常ORA-00001

商辰钊
2023-03-14
问题内容

我正在使用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)

问题答案:

一个独特的约束强制实施,那么,唯一性。与主键约束不同,它将允许空值。

您的错误表示您已将数据库配置为显式禁止重复数据插入。

您可以通过在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。注意它会返回一个块。

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

参数schema是可选的。



 类似资料:
  • 我正在使用Spring和Hibernate,我得到了这个例外。以下是我试图获得的:我有User和UserSettings类,它们以OneToMany和ManyToOne注释为界,如下所示: 现在,我想为用户添加设置,我是这样做的: 问题来了:UserSettings中的用户持有旧设置和新设置的集合(设置,我刚刚创建并想要添加),但旧设置持有用户的集合,其中没有新设置。我想这就是为什么我会遇到异常,

  • 我有一个MathematicsAnswer引用的实体数学。如果对数学执行post请求,我会得到一个例外,即MathsAnswer上的字段不能为空。但我确实在球场上跳了起来。拜托,我需要这个解决方案<代码>java.sql。SQLIntegrityConstraintViolationException:列'question_id'不能为空。 sql架构: 实体类: MathsAnswers.jav

  • 我正试图插入数据库,但我在日志上看到了这样的消息: 我找到了这个查询以获取违反的密钥:

  • 我有一个迁移脚本之间的2个不同的模式数据库。脚本做了3件事:1。禁用约束2。将记录从旧架构插入到新架构3。启用约束 我发现这两个约束在旧的模式中是不存在的。这2个表的表结构定义有什么问题吗?

  • 以下是SQL部分,我在调试代码时出错: ORA-00001:唯一约束主键违反T_LIAV_AGENT_STATE_APPROVAL... 这是主键约束依赖的2列AV_NAME_ID,AV_STATE... 我没有重复的数据...你认为还有其他原因吗?