Merge into 시 Sequence 값의 증가가 일어나네요. 0 4 11,114

by 정진우 Merge Merge into Sequence 시퀀스 자동증가 [2014.01.14 10:37:58]


안녕하세요 ^^

또 질문을 하나 올리게되었네요.

얼마전 질문을 드려 좋은 답변들을 주셔서 

Merge into를 활용해서 쿼리 작동확인 후 테스트를 해보다가 확인된 사항입니다.


MERGE INTO TABLE1
USING DUAL
ON    (TEST = v_val1 AND TEST2 = v_val2)
WHEN NOT MATCHED
    INSERT ( ID, TEST. TEST2)
    VALUES (SEQ_ID.NEXTVAL, v_val1, v_val2);

이렇게 동일한조건의 값이 없다면 insert 하도록 설정되어있는데

이미 동일한 데이터가 존재하고 있어서, 데이터는 입력되지도 않았는데도

시퀀스는 값이 증가하더라구요.

DBMS_OUTPUT.PUT_LINE(SEQ_ID.CURRVAL); 할때마다 시퀀스값이 1 씩늘어나 있습니다.

원래 이런건가요 ? ..

이렇게되면 SEQ를 주는 부분이 조금 의미가 없는것같기도하고 ...

제약을 주거나, SEQ 대신 쓸 수있는 항목이나 값이 따로 있을까요 ??
by 용근님 [2014.01.14 11:08:09]
원래 그렇구요

ibatis라면 selectKey 속성으로 한번 해보시겠어요? 테스트는 못해봤지만

by 정진우 [2014.01.14 14:50:47]
답변주셔서 감사합니다 :)

해당 부분은 ibatis 를 활용하는게 아니라

적용하기가 어렵겠네요 ^^;

다른방법으로 풀어보았습니다.

by feel [2014.01.14 12:45:09]

Merge 문에서 sequence 사용시 값이 증가하는 부분은 처음 알게되었네요..

그런데
'이렇게되면 SEQ를 주는 부분이 조금 의미가 없는것같기도하고 ...'
이부분에 대하여 몆자 적어봅니다.

1. sequence는 100%로 순차적인 값을 보장하는가?
    -> 보장하지 않습니다.
2. sequence 을 사용하는 이유?
    -> 동시성을 보장하면서 유일성을 보장하기 위해서 사용하는 경우가 가장 많을것 같습니다.
3. 일련번호(대부분 PK)를 sequence를 사용한경우 꼭 순차적이어야 하는가?
    -> 그렇지 않다고 생각합니다. 2번에서 처럼 sequence 사용은 동시성, 유일성을 보장하기 위해서
주로 사용하는 오라클 오브젝트라고 생각합니다.
 임의의 숫자로, 중복성을 피하기 위하여 sequence을 사용한것이고, ID라는 컬럼의 의미도 임의의 숫자이기 때문에 Business Rule을 위배한다고 생각치 않습니다. 

by 정진우 [2014.01.14 14:54:28]
작성해주신 댓글 잘 읽어보았습니다.

제가 사용목적이 로그수집용이다보니, 

사용하는 쿼리부분이 실제 운영되는 사이트라면 굉장히 많이 호출될 것이다! 라는 부분을 제외하고

적어두었네요.. ^^

저는 이제 오라클을 배우기 시작해서 많이 서툴지만 이 부분은 '트리거'를 사용해서 해결을 보았습니다.

MERGE INTO 시에 ID 컬럼부분을 제외한 다른 부분의 값을 INSERT 하도록하고,

TRIGGER에서 BEFRE INSERT 시에 ID가 NULL 이면 시퀀스가 증가한값을 넣도록 하는걸

인터넷 검색을 통해서 보게되었네요.

타사이트 이긴 하지만 링크를 걸어 봅니다.


http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:256815210563
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입