문제 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를 클릭합니다.
언급URL : https://stackoverflow.com/questions/9689412/issue-ora-00001-unique-constraint-violated-coming-in-insert-update
'source' 카테고리의 다른 글
양방향 바인딩이란 무엇입니까? (0) | 2023.08.07 |
---|---|
Maria의 JSON_OBJ 안에서 JSON 배열 처리DB (0) | 2023.08.07 |
디스플레이의 반대가 있습니까: 없음? (0) | 2023.08.07 |
전체 경로가 없는 Python Glob - 파일 이름만 있음 (0) | 2023.08.07 |
PHP 및 AJAX 보안 질문 (0) | 2023.08.07 |