티스토리 뷰

 

데이터베이스 작업에서 다른 테이블의 데이터를 SELECT하여 새로운 테이블에 INSERT하는 경우가 자주 발생합니다. 이 글에서는 PostgreSQL, MySQL/MariaDB, MSSQL에서 INSERT INTO SELECT 구문을 사용하는 방법을 비교해보겠습니다.

PostgreSQL
INSERT INTO SELECT 구문

INSERT INTO 대상_테이블 (열1, 열2, 열3, ...)
SELECT 열1, 열2, 열3, ...
FROM 원본_테이블
WHERE 조건;

ex) 예시

INSERT INTO archived_employees (name, position, salary)
SELECT name, position, salary
FROM employees
WHERE termination_date IS NOT NULL;

중복되는 경우 예외처리 'ON CONFLICT' 로 UPDATE충돌 처리가능.

INSERT INTO 테이블명 (열1, 열2, 열3, ...)
SELECT 열1, 열2, 열3, ...
FROM 원본_테이블
WHERE 조건
ON CONFLICT (충돌_열) DO UPDATE SET 열1 = 값1;

MySQL/MariaDB
INSERT INTO SELECT 구문

INSERT INTO 대상_테이블 (열1, 열2, 열3, ...)
SELECT 열1, 열2, 열3, ...
FROM 원본_테이블
WHERE 조건;

ex) 예시

INSERT INTO archived_employees (name, position, salary)
SELECT name, position, salary
FROM employees
WHERE termination_date IS NOT NULL;

 

MySQL/MariaDB는 'ON DUPLICATE KEY UPDATE' 구문을 통해 충돌처리 가능.

INSERT INTO 테이블명 (열1, 열2, 열3, ...)
SELECT 열1, 열2, 열3, ...
FROM 원본_테이블
WHERE 조건
ON DUPLICATE KEY UPDATE 열1 = 값1;

MSSQL
INSERT INTO SELECT 구문

INSERT INTO 대상_테이블 (열1, 열2, 열3, ...)
SELECT 열1, 열2, 열3, ...
FROM 원본_테이블
WHERE 조건;

ex) 예제

INSERT INTO archived_employees (name, position, salary)
SELECT name, position, salary
FROM employees
WHERE termination_date IS NOT NULL;

MSSQL은 'MERGE' 구문을 통해 충돌을 처리가능.

MERGE INTO archived_employees AS target
USING (SELECT id, name, position, salary
       FROM employees
       WHERE termination_date IS NOT NULL) AS source
ON target.id = source.id
WHEN MATCHED THEN
    UPDATE SET target.name = source.name,
               target.position = source.position,
               target.salary = source.salary
WHEN NOT MATCHED BY TARGET THEN
    INSERT (id, name, position, salary)
    VALUES (source.id, source.name, source.position, source.salary);


PostgreSQL, MySQL/MariaDB, MSSQL의 INSERT INTO SELECT 구문은 기본 구조는 유사하지만, 트랜잭션 처리, 성능 최적화, 예외 처리 등에서 차이점이 존재합니다. 각 데이터베이스의 특성을 이해하고 활용하면 더 효율적인 데이터베이스 작업을 수행할 수 있습니다. 이 글이 여러분의 데이터베이스 활용에 도움이 되길 바랍니다.