MySQL에서 UNION ALL로 두 테이블에 레코드 한 번에 삽입하기
MySQL에서는 INSERT INTO ... SELECT 문과 UNION ALL을 결합하면 하나의 쿼리만으로 여러 테이블에 레코드를 동시에 삽입할 수 있습니다. 이 방식은 SELECT 문으로 기존 테이블의 데이터를 조회한 뒤, 그 결과를 다른 테이블에 그대로 저장하는 원리로 동작합니다. 아래 예제를 통해 실제 사용 방법을 단계별로 살펴보겠습니다.
1단계: 첫 번째 테이블 생성
먼저 예제에 사용할 첫 번째 테이블을 생성하는 쿼리입니다.
mysql> create table DemoTable1
-> (
-> StudentName varchar(20),
-> StudentMarks int
-> );
Query OK, 0 rows affected (0.67 sec)
2단계: 두 번째 테이블 생성
위 개념을 제대로 이해하기 위해 두 번째 테이블도 함께 만들어 보겠습니다.
mysql> create table DemoTable2
-> (
-> Name varchar(20)
-> );
Query OK, 0 rows affected (0.61 sec)
3단계: 두 번째 테이블에 데이터 삽입
INSERT 명령을 사용해 두 번째 테이블에 레코드를 추가합니다.
mysql> insert into DemoTable2 values('Chris');
Query OK, 1 row affected (0.12 sec)4단계: 삽입된 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select * from DemoTable2;
실행하면 다음과 같은 출력 결과가 나타납니다.
+-------+
| Name |
+-------+
| Chris |
+-------+
1 row in set (0.00 sec)
5단계: UNION ALL을 활용한 단일 쿼리 삽입
아래는 단 하나의 MySQL 쿼리로 레코드를 조회하고 동시에 삽입하는 핵심 쿼리입니다. UNION ALL을 사용하면 동일한 이름 'Chris'에 서로 다른 점수(89점, 98점)를 가진 두 개의 행이 생성되어 첫 번째 테이블에 한꺼번에 들어갑니다.
mysql> insert into DemoTable1
-> select Name,89 from DemoTable2
-> union all
-> select Name,98 from DemoTable2;
Query OK, 2 rows affected (0.15 sec)
Records: 2 Duplicates: 0 Warnings: 0
6단계: 최종 결과 확인
이제 첫 번째 테이블에서 레코드를 조회해 삽입이 정상적으로 이루어졌는지 확인할 수 있습니다.
mysql> select * from DemoTable1;
실행 결과는 다음과 같습니다.
+-------------+--------------+
| StudentName | StudentMarks |
+-------------+--------------+
| Chris | 89 |
| Chris | 98 |
+-------------+--------------+
2 rows in set (0.00 sec)
UNION ALL과 UNION의 차이점
참고로 UNION ALL은 중복된 행까지 모두 포함하여 결과를 반환하는 반면, 일반 UNION은 중복 행을 자동으로 제거합니다. 위 예제처럼 의도적으로 중복 데이터를 유지하고 싶다면 UNION ALL을 사용하는 것이 적합하며, 성능 면에서도 중복 검사를 생략하는 UNION ALL이 더 빠르게 동작한다는 장점이 있습니다.