[ORACLE] ignore_row_on_dupkey_index 힌트 사용으로 PK중복 제거 값만 INSERT


    데이터 적재 시 INSERT ~ SELECT ~를 사용하는 경우가 많은데 대량 적재 시 PK 중복 에러가 발생하면 데이터를 특정하기 어려운 경우가 있습니다.
    11gR2 이후 버전부터는 ignore_row_on_dupkey_index 힌트를 사용하면 쉽게 해결할 수 있는데 키값이 중복되는 경우 오류를 발생시키지 않고 중복되지 않는 데이터만 입력해 주는 힌트 입니다.
    아래 테스트 내용 확인하세요

    테스트 테이블 생성

    T1 테이블에 PK가 있고 중복되는 데이터 id=1 값을 T2에 생성
    SQL> create table sk.t1 (
        id number primary key,
        name varchar2(20)
    )
    ;
    
    insert into sk.t1 values (1, '1길동');
    insert into sk.t1 values (2, '2길동');
    insert into sk.t1 values (3, '3길동');
    
    SQL> select * from sk.t1;
    
    	ID NAME
    ---------- --------------------
             1 1길동
             2 2길동
             3 3길동
    
    create table sk.t2 (
        id number primary key,
        name varchar2(20)
    );
    
    insert into sk.t2 values (1, '1길동');
    insert into sk.t2 values (4, '4길동');
    insert into sk.t2 values (5, '5길동');


    데이터 적재

    T2테이블의 데이터를 T1에 INSERT 시 PK중복에러 발생
    ignore_row_on_dupkey_index 힌트 사용 시 중복 값은 제외 후 나머지 데이터만 적재됨
    SQL> insert into sk.t1 select * from sk.t2 ;
    insert into sk.t1 select * from sk.t2
    *
    ERROR at line 1:
    ORA-00001: unique constraint (SK.SYS_C007926) violated
    
    -- ignore_row_on_dupkey_index 힌트를 사용(테이블명 PK명)
    SQL> insert /*+ ignore_row_on_dupkey_index(t1 SYS_C007926)  */ into sk.t1 select * from sk.t2;
    
    2 rows created.
    
    SQL> commit ;
    
    Commit complete.
    
    SQL> select * from sk.t1 ;
    
    	ID NAME
    ---------- --------------------
             1 1길동
             2 2길동
             3 3길동
             4 4길동
             5 5길동
    

    댓글