MySQL에서 한 테이블의 데이터를 열 이름이나 구조가 다른 다른 테이블로 복사해야 하는 경우가 자주 있습니다. 이럴 때 유용하게 사용할 수 있는 것이 바로 INSERT INTO ... SELECT 문입니다.
INSERT INTO SELECT 문은 SELECT 쿼리의 결과를 그대로 다른 테이블에 삽입할 수 있게 해주며, 원본 테이블과 대상 테이블의 열 이름이 달라도 열 순서만 올바르게 매핑하면 손쉽게 데이터를 복사할 수 있습니다.
아래 예제를 통해 실제 동작 과정을 단계별로 살펴보겠습니다.
1단계: 첫 번째 테이블 생성
먼저 클라이언트 정보를 저장할 테이블을 생성합니다. ClientId는 자동 증가(AUTO_INCREMENT) 기본키로 설정하고, 시작값은 1000으로 지정했습니다.
mysql> create table DemoTable1900
(
ClientId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
ClientName varchar(20),
ClientAge int default 29
) auto_increment=1000;
Query OK, 0 rows affected (0.00 sec)2단계: 샘플 데이터 삽입
INSERT 명령을 사용해 몇 개의 레코드를 추가합니다. 마지막 레코드처럼 나이 값을 생략하면 기본값인 29가 자동으로 입력됩니다.
mysql> insert into DemoTable1900(ClientName,ClientAge) values('Chris',45);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1900(ClientName,ClientAge) values('David',29);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1900(ClientName,ClientAge) values('Mike',37);
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1900(ClientName) values('Sam');
Query OK, 1 row affected (0.00 sec)3단계: 원본 테이블 데이터 확인
SELECT 문으로 테이블에 저장된 전체 레코드를 확인합니다.
mysql> select * from DemoTable1900;
실행 결과는 다음과 같습니다.
+----------+------------+-----------+ | ClientId | ClientName | ClientAge | +----------+------------+-----------+ | 1000 | Chris | 45 | | 1001 | David | 29 | | 1002 | Mike | 37 | | 1003 | Sam | 29 | +----------+------------+-----------+ 4 rows in set (0.00 sec)
4단계: 두 번째 테이블 생성
이번에는 열 이름이 완전히 다른 직원 정보 테이블을 생성합니다. EmployeeId, EmployeeName, EmployeeAge라는 새로운 열 이름을 사용합니다.
mysql> create table DemoTable1901
(
EmployeeId int,
EmployeeName varchar(20),
EmployeeAge int
);
Query OK, 0 rows affected (0.00 sec)5단계: INSERT INTO SELECT로 레코드 복사
핵심 부분입니다. 대상 테이블의 열 목록과 SELECT 절의 열을 순서대로 매핑하여, 열 이름이 다른 두 테이블 간에도 데이터를 복사할 수 있습니다.
mysql> insert into DemoTable1901(EmployeeId,EmployeeName,EmployeeAge)
select ClientId,ClientName,
ClientAge from DemoTable1900;
Query OK, 4 rows affected (0.00 sec)
Records: 4 Duplicates: 0 Warnings: 0여기서 주목할 점은 다음과 같습니다.
- ClientId → EmployeeId, ClientName → EmployeeName, ClientAge → EmployeeAge로 열이 일대일로 매핑됩니다.
- SELECT 절의 열 순서가 반드시 INSERT 대상 열 순서와 일치해야 합니다.
- WHERE 조건을 추가하면 특정 레코드만 선택적으로 복사할 수도 있습니다.
6단계: 복사 결과 확인
마지막으로 대상 테이블의 데이터를 조회해 정상적으로 복사되었는지 확인합니다.
mysql> select * from DemoTable1901;
실행 결과는 다음과 같습니다.
+------------+--------------+-------------+ | EmployeeId | EmployeeName | EmployeeAge | +------------+--------------+-------------+ | 1000 | Chris | 45 | | 1001 | David | 29 | | 1002 | Mike | 37 | | 1003 | Sam | 29 | +------------+--------------+-------------+ 4 rows in set (0.00 sec)
정리
이처럼 INSERT INTO ... SELECT 문을 사용하면 열 이름이나 개수가 다른 테이블 사이에서도 데이터를 자유롭게 복사할 수 있습니다. 실무에서는 테이블 마이그레이션, 백업, 통합 작업 시 매우 자주 활용되는 패턴이므로 꼭 익혀두시기 바랍니다. 필요에 따라 WHERE, JOIN, GROUP BY 등의 절을 함께 사용하면 더욱 유연한 데이터 복사가 가능합니다.