gpt4 book ai didi

oracle - 违反约束异常 ORA-00001

转载 作者:行者123 更新时间:2023-12-01 07:42:33 24 4
gpt4 key购买 nike

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

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

我已经检查了表上的索引以获取索引名称 DBSCHEMA.IDX_CO_DETAILS 。

它不包括任何列的( INCLUDE_COLUMN 为空)。我怎么知道这个约束是什么?是主键约束吗?

我们正在为 ORM 使用 hibernate 。以下是 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 unique constraint强制执行唯一性。它将允许空值,不像 primary key constraint .

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

您可以通过在 all_constraints 上运行以下查询来找出表上的约束条件。 .链接解码列CONSTRAINT_TYPE ,例如 P是主键和 U唯一的 key 。

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是可选的。

关于oracle - 违反约束异常 ORA-00001,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10969693/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com