본문 바로가기
IT/DB

[ORACLE] MERGE문 무결성 제약조건 위배의 경우 (ORA-00001)

by 스터딩아재 2021. 10. 26.
반응형

 

CHAR 타입으로 인한 MERGE문 실행 시 무결성 오류가 나는 경우

 

* MERGE문은 조건에 만족하면 INSERT와 UPDATE로 알아서 분기된다. 두 개 이상의 세션에서 동시에 날려서 PK가 중복된 경우는 당연히 발생 가능하다. 그런데 난 혼자 개발 중인데 왜 무결성 오류가 날까?

 

 

* 우선 에러가 발생한 쿼리를 먼저 보면 ON절에 키값 1개만 걸린 매우 기본적인 MERGE문이다.

MERGE 
  INTO  TABLE_A A
  USING DUAL
  ON    (A.KEY1 = #KEY1#)

WHEN MATCHED THEN
UPDATE SET ()

WHEN NOT MATCHED THEN 
INSERT () VALUES ()

 

 

* 이 쿼리 실행 시 무결성 오류가 난다면 KEY1의 데이터 타입이 CHAR 인지 확인해보자.

 

* 만약 CHAR 타입이 맞다면 이제 우린 CHAR와 VARCHAR2의 특성을 알아야 된다. (아래 포스팅 읽어보는걸 추천한다)

 

[ORACLE] 오라클 데이터타입 CHAR와 VARCHAR2의 차이

* 문자형 데이터 타입 중 CHAR와 VARCHAR2의 차이를 알아보자. * CHAR의 경우 아래 상황으로 인한 특수한 상황을 제외하고는 CHAR보다는 VARCHAR2 사용을 권장한다. CHAR와 VARCHAR2의 차이 1) VARCHAR2 ( size BY..

studyingazae.tistory.com

 

 

* 위 포스팅의 내용을 요약하면, CHAR는 선언된 자리수 만큼 공백을 붙이게 된다.

 

 - CHAR(5) = 'ABC  '

 - VARCHAR2(5) = 'ABC'

 

* 이 과정에서 WHERE절에서 오류가 나게 된다. DB툴에서는 상수로 비교해 문제가 안 생기고, 바인드 변수로 비교할 때 FALSE가 된다.

 

 

해결방법

1) 컬럼타입 VARCHAR2로 변경

 

* 최고의 방법은 CHAR를 VARCHAR2로 변경하는 것이다. (데이터 타입변경은 아래 포스팅 참고)

 

 

[ORACLE] 오라클 DDL ALTER 문

* 컬럼 추가/삭제, 데이터 타입 변경, 코멘트 변경 * ALTER문 일하다 보면 자주 쓰는데 정말 기억 안 나고 매번 찾기 귀찮다. 모아 두자. 1. 컬럼 추가/수정/삭제 -- 추가 ALTER TABLE 테이블명 ADD(컬럼명

studyingazae.tistory.com

 

 

2) 컬럼타입 변경이 어려우면 SQL 변경

 

* 컬럼을 바꾸는 것도 쉬운 일은 아니기에 아래처럼 수정하면 정상 작동한다.

 

* TRIM 보다는 RPAD를 추천한다.

A.KEY1 = RPAD( #KEY1#, 컬럼사이즈, ' ')

또는

TRIM(A.KEY) = #KEY1#

 

 

이거 때문에 하루종일 고생했는데
유사한 문제가 생기신 분이 참고하셔서 잘 해결되시길

 

그리드형

댓글