중복된 레코드 무시하고 Insert하기 0 12 3,815

by 황희성 [SQL Query] [2016.05.13 09:47:52]


쿠폰번호 같은걸 무작위로 생성한 다음 입력할때 이미 등록되어 있는 코드와 동일한 코드면

건너뛰고 다음 코드 입력 하게끔 쿼리 작성이 가능한가요?? (트리거를 이용한다던지...)

쿠폰 번호는 엑셀로 생성해서 insert문을 레코드 만큼 생성해서 exectue시키려고 합니다.

혹시 insert하는 것도 좋은 방법있으면 조언 부탁드립니다.

by 겸댕2후니 [2016.05.13 09:57:30]

원쿼리로 실행하시기 바랍니다.

ex) insert into table select level from dual connect by level <= 100;


by 황희성 [2016.05.13 10:05:30]

죄송하지만 쿼리 설명 좀 부탁드릴께요. 이 정도도 이해 못하는 수준이라 부끄럽습니다.ㅜㅜ


by 마농 [2016.05.13 10:15:25]

테이블에 유일키 설정이 되어 있다면?

자동으로 걸러집니다.


by 황희성 [2016.05.13 10:17:43]

테이블에 코드가 키로 잡혀있긴 한데. 중복되면 에러뜨고 트랜젝션을 종료하지 않나요??

무시되고 다음 쿼리가 실행되지 않던데. 제가 잘못 이해 하고 있는걸지도....


by 마농 [2016.05.13 10:21:10]

실행 방법에 따라 다르겠죠?

위에 적으신 걸로 봐서는 레코드 건수만큼 Insert 구문이 있는듯 한데요?

일괄 실행시키면 차례대로 쭈욱 수행될 것이고요.(에러 여부완 상관 없이)


by 겸댕2후니 [2016.05.13 10:22:21]

insert방식을 위에서 말씀하신대로, 모든 로우수만큼 insert문을 생성하여

삽입한다면, 중복레코드는 자동으로 걸러집니다.

삽입단위가 각로우이기 때문이죠.

중복되는 부분은? 제약조건 오류나겠죠.

그렇지않은 부분은? 삽입되겠죠.

결과적으로는? 증복된 부분빼고 모두 삽입.


by 미스틱매니아 [2016.05.13 10:50:38]

기본적인 구조로 보면

insert ~ => 최초 성공시 TX 시작

insert ~ => 성공 or 실패

insert ~ => 성공 or 실패

(반복)

commit or rollback => TX 종료

 

때문에 중간에 에러가 나건 말건 insert 문을 하나하나 넣는 방식이면 commit/rollback이 발생하지 않는 이상 트랜잭션이 끝나지 않습니다.


by 황희성 [2016.05.13 10:50:50]

두분 답변 감사합니다. 테스트 해보겠습니다.^^


by 황희성 [2016.05.13 12:14:44]

insert into coupon (couponNum) values ('1111');

insert into coupon (couponNum) values ('1111');

insert into coupon (couponNum) values ('2222');

이렇게 하면 오류가 나서 2222가 삽입이 안됩니다. 그래서 구글링 하다 찾은건데 힌트옵션이 있더군요.

일단 힌트 옵션으로 해결은 했습니다만 퍼포먼스에 영향을 미칠까봐 좀 걱정되긴 합니다.

사용한 옵션은 ignore_row_on_dupkey_index옵션입니다.

혹시 더 나은 방법 아시는 분 답변부탁드립니다.^^


by 마농 [2016.05.13 13:05:55]

SQL 구문을 그냥 실행하셨다면? 개별 실행되어 앞선 설명대로 될건데요.
중간에 에러가 나고 더이상 진행이 안된다면?
SQL 구문을 그냥 실행한게 아니라 PL/SQL 블럭(BEGIN ~ END)으로 묶어서 실행한게 아닐까? 의심되네요.
어떻게 실행하신건지? 실행 방법을 정확하게 묘사해 주세요.


by 황희성 [2016.05.13 13:59:52]

실은 델파이 개발을 하면서 컴포넌트로 쿼리를 실행하는데. 아마 컴포넌트에서 쿼리를 하나씩 실행하게끔 설계가 되어 있었나 봅니다. 저도 이것때문에 좀 애먹었네요.ㅋㅋㅋ

혹 이런 내용을 쓰지 않아서 혼동을 일으켰거나 불편하셨다면 사과드립니다.


by 이재현 [2016.05.13 16:11:17]

INSERT INTO TABLE_NAME ( C1 , C2 , C3 )

SELECT *

  FROM (

SELECT 'A' AS C1

          , 'B' AS C2

          , 'C' AS C3

FROM DUAL

) A

WHERE 1 = 1

  AND NOT EXISTS(SELECT 'X' FROM TABLE_NAME B WHERE B.C1 = A.C1 --PK 조인 )

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