2012-06-10 6 views
3

Oracle 데이터베이스를 사용하고 있습니다. 우리는 우리의 서비스에 대한 호출에 자주 실패하고 있습니다. 테이블에서 예외가 발생하는 것을보고 로그를 볼 때제약 조건 위반 예외 ORA-00001

java.sql.BatchUpdateException : ORA-00001 : 고유 제한 조건 (DBSCHEMA.IDX_CO_DETAILS)이 위반되었습니다.

색인 이름 DBSCHEMA.IDX_CO_DETAILS에 대한 색인을 점검했습니다.

열 (INCLUDE_COLUMN이 null 임)을 포함하지 않았습니다. 이 제약 조건이 무엇인지 어떻게 알 수 있습니까? 기본 키 제약 조건입니까?

우리는 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) 

답변

10

unique constraint 시행한다, 잘, 고유성에 다시 추적이다. primary key constraint과 달리 null을 허용합니다.

오류는 명시 적으로 금지하도록 데이터베이스를 구성한 경우 중복 데이터를 삽입한다는 의미입니다.

all_constraints에서 다음 쿼리를 실행하면 테이블에 어떤 제약 조건이 있는지 알 수 있습니다. 링크는 CONSTRAINT_TYPE 열을 디코딩합니다. 예를 들어 P은 기본 키이고 U은 고유 키입니다.

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'을 추가 할 수 있습니다 조회하려면 다음 중 하나를

select * 
    from all_constraints uc 
where uc.table_name = 'MY_TABLE' 
    and owner = 'DBSCHEMA' 

대신 제약 사용 all_cons_columns에, 또는 두 하나에 쿼리를 결합하는 것은 어떤 열을 찾으려면 문제를 일으키는 특정 제약 조건.


귀하의 의견은 몇 가지 이유 때문에 조금 놀랍습니다. 시스템 생성 제약 조건, 예를 들어 이름이 지정되지 않은 상태에서 테이블을 만들 때 인라인으로 정의 된 제약 조건도 표시되어야합니다. 또한 제약 조건 이름 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은 선택 사항입니다.

+0

두 쿼리를 모두 실행했습니다. 나는 행을 반환하지 않았으므로 소유자를 제거했습니다. 제약 조건에는 IDX_CO_DETAILS라는 이름이 없으며 고유 키 제약 조건이 없습니다. 오라클이 기본 키로 생성 한 인덱스 제약이 될 수 있습니까? – Poorna

+0

@Shishir, 나는 나의 대답을 더 많은 정보로 업데이트했다. – Ben

+0

예 all_indexes 테이블에 있습니다. 하지만 dbms_metadata에 대한 마지막 쿼리를 실행할 때 개체를 찾을 수 없습니다. 오류가 발생했습니다. 테이블 메타 데이터를 가져 오는 또 다른 내부 도구가 있습니다. IDX_CO_DETAILS는 세 개의 컬럼을 기반으로합니다. 따라서 색인을 생성하는 동안 실패해야합니다. 그렇다면 테이블 자체보다는 인덱스에 제약 조건을 추가하는 것이 합리적입니까? 이 경우 JDBC 일괄 업데이트 예외가 발생합니다. 인덱스보다는 테이블에 제약이 있다면이를 피할 수 있었습니까? – Poorna