IT이야기
데이터베이스별 INSERT INTO SELECT 사용법: PostgreSQL, MySQL, MSSQL
제이제이v
2024. 6. 16. 15:50
데이터베이스 작업에서 다른 테이블의 데이터를 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 구문은 기본 구조는 유사하지만, 트랜잭션 처리, 성능 최적화, 예외 처리 등에서 차이점이 존재합니다. 각 데이터베이스의 특성을 이해하고 활용하면 더 효율적인 데이터베이스 작업을 수행할 수 있습니다. 이 글이 여러분의 데이터베이스 활용에 도움이 되길 바랍니다.