유지보수중에 무결성제약조건 위배 에러가 발생했는데요. 0 4 1,737

by 타핑이 [2019.04.15 15:42:04]


아래와 같은 테이블입니다.

TABLE1테이블의 PK는 SEQN 하나뿐이고,

SEQN에 데이터가 들어가는 방법은 아래 쿼리와 같습니당.

루프로 돌면서 아래 쿼리 수행후 바로 커밋을 수행하고 있습니다.

 

제가 보기에는 아래쿼리 수행중에 무결성제약조건 위배 에러가 도저히 날 수가 없어 보이는데,

어떤 경우도 상관없으니 아래 쿼리 수행중에 무결성제약조건 위배 에러가 날 수 있는 가능성 제시 좀 부탁드립니다.ㅠ

 

INSERT INTO TABLE1 (

SEQN,

A,

B,

.

.

) VALUES (

(SELECT (TO_CHAR(SYSDATE, 'YYMMDD')||(SELECT LPAD(NVL(MAX(SUBSTR(SEQN,7)),0) + 1, 5, 0) FROM TABLE1 WHERE SEQN LIKE LIKE TO_CHAR(SYSDATE, 'YYMMDD')||'%')) FROM DUAL),

'A',

'B',

.

.

.

)

by 마농 [2019.04.15 15:59:56]

1. MAX(SUBSTR()) 은 비효율입니다. SUBSTR(MAX()) 로 바꾸셔야 합니다.
  - 다만 오류 원인이 이건 아니구요.
  - 성능상 문제로 반드시 바꾸시기 바랍니다.
2. 오류 메시지 정확하게 확인해 보세요.
  - 오류 메시지에 제약조건 명칭이 뜨지 않나요?
  - PK 말고 다른 UK 때문에 뜨는 오류는 아닌지?


by 타핑이 [2019.04.15 16:17:02]

UK는 없네요

ORA-00001: 무결성 제약 조건(SCHEME.PK_TABLE1) 이렇게 하나 밖에 없는데,

유지보수 관련자한테 물어보니까 저희뿐만 아니라 다른데서도 저 테이블에 데이터 넣을 수도 있다고해서

혹시나 그건가 하고 짐작중이긴 합니다 ㅠ

답변 감사합니다!


by 마농 [2019.04.15 16:19:53]

여러군데서 동시 입력 진행된다면? 에러 날 수 있습니다.


by 단비아빠 [2019.04.16 15:43:21]

마농님 의견이 맞습니다.

여러군데서 동시에 입력이 된다면 거의 동시에 일자별로 최대값을 구하고 더하기 1을 하여 먼저 insert가 완료된 후 다른 트랜잭션에서 insert를 한다면 충분히 DUP 에러가 발생될 수 있는 구조입니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입