source

문제 ORA-00001: INSERT/UPDATE에서 고유 제약 조건을 위반했습니다.

factcode 2023. 8. 7. 23:09
반응형

문제 ORA-00001: INSERT/UPDATE에서 고유 제약 조건을 위반했습니다.

애플리케이션을 통해 테이블에 몇 가지 값을 삽입하고 이슈 ORA-00001: 고유 제약 조건 위반을 받으려고 합니다.시퀀스가 테이블의 가장 높은 ID와 동기화되지 않았지만 시퀀스 번호를 수정한 후에도 오류가 계속 발생합니다.이 오류를 더 디버깅하려면 어떻게 해야 합니까, 오라클 로그가 더 많은 오류를 제공합니까?오라클 로그를 어떻게 볼 수 있습니까?감사합니다.

업데이트: 감사 로깅 플러그인을 사용하고 있으며 사용자의 도메인 클래스에서 저장 이벤트를 캡처하고 감사 로그에 항목을 기록합니다.

사용자 클래스에서는 다음을 수행합니다.

class User {

//some attributes, constraints, mappings

def onSave = {
 Graaudit aInstance = new Graaudit();
         aInstance.eventType= "GRA User Create"
         aInstance.eventDescription = "GRA User Created"
         aInstance.objectid = username
         aInstance.objecttype = 'GRAUSER'
         aInstance.user_id = RequestContextHolder.currentRequestAttributes().session.username

          aInstance.withTransaction{
              aInstance.save()
          }
    }

}

위 코드가 onSave 이벤트에 없으면 사용자가 성공적으로 생성됩니다.
인스턴스에서 사용 중인 최대 절전 모드 트랜잭션과 관련이 있거나 저장으로 인해 현재 트랜잭션이 중단되는 것으로 가정합니다.
거래를 사용하지 않으면 예외가 발생합니다."org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here"이 문제를 해결하는 방법을 잘 모르겠습니다.감사해요.

오류 메시지에는 위반된 제약 조건의 이름이 포함됩니다(테이블에 둘 이상의 고유 제약 조건이 있을 수 있음).이 제약 조건 이름을 사용하여 고유 제약 조건이 선언된 열을 식별할 수 있습니다.

SELECT column_name, position
  FROM all_cons_columns
 WHERE constraint_name = <<name of constraint from the error message>>
   AND owner           = <<owner of the table>>
   AND table_name      = <<name of the table>>

영향을 받는 열을 알고 나면 데이터를 비교할 수 있습니다.INSERT또는UPDATE제약 조건이 위반되는 이유를 확인하기 위해 테이블에 이미 있는 데이터에 대해.

이 ORA 오류는 고유 제약 조건 위반으로 인해 발생합니다.

ORA-00001: unique constraint (constraint_name) violated

이것은 실행을 시도하기 때문에 발생합니다.INSERT또는UPDATE고유 인덱스로 제한된 필드에 중복 값을 만든 문입니다.

다음 방법으로 이 문제를 해결할 수 있습니다.

  • 중복을 허용하도록 제약 조건 변경 또는
  • 고유한 제약 조건을 삭제하거나 중복된 삽입을 방지하기 위해 SQL을 변경할 수 있습니다.

Oracle의 오류 메시지는 다소 길어야 합니다.일반적으로 다음과 같이 나타납니다.

ORA-00001: unique constraint (TABLE_UK1) violated

괄호 안의 이름은 구속자 이름입니다.어떤 제약 조건이 위반되었는지 알려줍니다.

오류 메시지는 다음과 같습니다.

Error message => ORA-00001: unique constraint (schema.unique_constraint_name) violated

ORA-00001은 다음과 같은 경우에 발생합니다: "쿼리가 테이블에 "중복된" 행을 삽입하려고 합니다."이로 인해 고유한 제약 조건이 실패하고 결과적으로 쿼리가 실패하고 행이 테이블에 추가되지 않습니다.

솔루션:

unique_constraint에 사용된 모든 열을 찾습니다. 예를 들어 열 a, 열 b, 열 c, 열 d는 집합적으로 unique_constraint를 만든 다음 다음 다음 쿼리를 사용하여 중복된 원본 데이터에서 레코드를 찾습니다.

-- to find <<owner of the table>> and <<name of the table>> for unique_constraint

select *
from DBA_CONSTRAINTS
where CONSTRAINT_NAME = '<unique_constraint_name>';

그런 다음 Justin Cave의 쿼리(아래 붙여넣기)를 사용하여 unique_constraint에 사용된 모든 열을 찾습니다.

  SELECT column_name, position
  FROM all_cons_columns
  WHERE constraint_name = <<name of constraint from the error message>>
   AND owner           = <<owner of the table>>
   AND table_name      = <<name of the table>>

    -- to find duplicates

    select column a, column b, column c, column d
    from table
    group by column a, column b, column c, column d
    having count (<any one column used in constraint > ) > 1;

원본 데이터에서 중복 레코드를 삭제하거나("선택에 삽입"에서 경험한 것처럼 특정한 경우 선택 쿼리) 고유하게 수정하거나 제약 조건을 변경할 수 있습니다.

인덱스를 선택한 후 필요한 인덱스를 선택하고 sql을 선택한 후 액션을 클릭한 후 rebuild를 클릭합니다.

enter image description here

언급URL : https://stackoverflow.com/questions/9689412/issue-ora-00001-unique-constraint-violated-coming-in-insert-update

반응형