[MSSQL, MySQL, Oracle] SELECT 해서 INSERT 방법(중복 INSERT 방지)

SQL 구문에서 SELECT INSERT 또는 INSERT SELECT 구문은 하나의 테이블을 다른 테이블로 레코드를 복사할 때 사용하는 구문입니다.

백업 테이블을 만들거나 필요한 조건에 해당하는 데이터만 별도의 테이블에 INSERT(추가)할 때 많이 사용하게 됩니다.

이번 글에서는 데이터베이스의 SQL에서 SELECT 해서 INSERT 방법(중복 INSERT 방지)에 대해 알아보겠습니다.

MS-SQL, MySQL, Oracle(오라클) 등의 데이터베이스에서 공통으로 사용할 수 있는 구문입니다.

[MSSQL, MySQL, Oracle] SELECT 해서 INSERT 방법(중복 INSERT 방지)

SELECT 해서 INSERT 하는 방법 – 기본 문법

SELECT 해서 INSERT 하는 방법에는 두 가지 유형이 있을 수 있습니다.

  1. 2개 테이블의 스키마가 동일한 경우
    별도로 컬럼명을 지정하지 않아도 그대로 삽입이 됩니다.
  2. 2개 테이블의 컬럼 중 일부만 같은 경우
    서로 매칭 되는 컬럼을 지정해 주어야 합니다.
— 2개의 테이블이 완전 동일한 스키마를 가진 경우
INSERT INTO target_table SELECT * FROM source_table
 
— 2개의 테이블 스키마 중 일부만 같은 경우
INSERT INTO target_table (col1, col2, col3, col4) SELECT col1, col2, col3, col4 FROM source_table
 
  • target_table은 삽입할 테이블명입니다.(Target table)
  • source_table은 조회할 테이블명입니다.(Soruce table)
  • col1, col2, col3, col4는 삽입(INSERT)하는 테이블의 컬럼(Column) 이름입니다.

SELECT 해서 INSERT 방법(중복 INSERT 방지)

SELECT 해서 INSERT 할 때 삽입할 테이블(Target table)에 조회할 테이블(Source table)의 데이터가 이미 존재한다면 ‘Unique constraint‘ 오류가 발생하게 됩니다. 즉, Key 필드에 대한 중복 오류로 INSERT가 처리되지 않게 됩니다.

Key 필드에 대한 중복 오류를 예방하기 위해서는 SELECT INSERT 구문을 조금 수정해 주어야 합니다.

아래 SQL 구문은 삽입할 테이블에 조회할 테이블의 데이터가 있는지 확인해서 없는 경우에만 INSERT 되도록 작성한 구문입니다.

— 중복 오류가 발생하지 않도록 INSERT 방법(Key필드가 col1, col2인 경우)
INSERT INTO target_table (col1, col2, col3, col4)
SELECT st.col1, st.col2, st.col3, st.col4
FROM (
      SELECT col1, col2, col3, col4,
             row_number() over (partition by col1, col2 order by col1, col2) as rows
      FROM source_table
     ) st
WHERE st.rows = 1
AND NOT EXISTS (SELECT 1
                FROM target_table tt
                WHERE tt.col1 = st.col1 AND tt.col2 = st.col2)
 
  • source_table의 DISTINCT를 처리하기 위해 row_number() 내장 함수를 사용하여 Key 필드가 동일한 경우 1건만 가져오도록 했습니다.
  • target_table의 key 필드에서 source_table의 데이터가 없는 경우만 INSERT 하도록 처리했습니다.(NOT EXISTS…)

마무리

2개의 테이블에서 데이터(레코드)를 SELECT 해서 바로 INSERT 하는 방법에 대해 알아보았습니다.

알아두면 한번의 SQL 구문으로 서로 다른 테이블의 데이터를 복사할 수 있어 무척 편리하게 사용할 수 있습니다.





이 글이 도움이 되었기를 바랍니다. ^-^
댓글로 흔적을 남겨 주세요.

답글 남기기