MySQL에서 두 테이블의 구조(컬럼명, 컬럼 개수 등)가 서로 다를 때도 INSERT INTO ... SELECT 문을 사용하면 손쉽게 한 테이블의 데이터를 다른 테이블로 복사할 수 있습니다. 핵심은 대상 테이블의 컬럼 목록과 SELECT 절의 컬럼 순서 및 개수를 정확히 일치시키는 것입니다.
1. 첫 번째 테이블 생성하기
먼저 원본이 될 테이블을 생성해 보겠습니다.
mysql> create table DemoTable1
-> (
-> PersonId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> PersonName varchar(20),
-> PersonAge int,
-> PersonCountryName varchar(20)
-> );
Query OK, 0 rows affected (0.55 sec)
2. 원본 테이블에 데이터 삽입하기
INSERT 명령어를 사용해 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable1(PersonName,PersonAge,PersonCountryName) values('Chris Brown',24,'US');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable1(PersonName,PersonAge,PersonCountryName) values('John Doe',26,'UK');
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable1(PersonName,PersonAge,PersonCountryName) values('David Miller',23,'AUS');
Query OK, 1 row affected (0.10 sec)SELECT 문으로 저장된 전체 레코드를 확인합니다.
mysql> select * from DemoTable1;
실행 결과는 다음과 같습니다.
+----------+--------------+-----------+-------------------+
| PersonId | PersonName | PersonAge | PersonCountryName |
+----------+--------------+-----------+-------------------+
| 1 | Chris Brown | 24 | US |
| 2 | John Doe | 26 | UK |
| 3 | David Miller | 23 | AUS |
+----------+--------------+-----------+-------------------+
3 rows in set (0.00 sec)
3. 구조가 다른 두 번째 테이블 생성하기
이번에는 컬럼명과 컬럼 개수가 모두 다른 테이블을 생성합니다. 특히 이 테이블에는 기본값(DEFAULT)이 설정된 EmployeeSalary 컬럼이 추가로 존재합니다.
mysql> create table DemoTable2
-> (
-> EmployeeId int,
-> EmployeeFullName varchar(30),
-> EmployeeAge int,
-> EmployeeCountryName varchar(20),
-> EmployeeSalary int default 20000
-> );
Query OK, 0 rows affected (0.52 sec)
4. INSERT INTO SELECT로 데이터 복사하기
구조가 다른 테이블 간에 데이터를 삽입할 때는 대상 테이블의 컬럼을 명시하고, SELECT 절에서 해당 컬럼과 매핑되는 원본 테이블의 컬럼을 순서대로 지정하면 됩니다.
mysql> insert into DemoTable2(EmployeeId,EmployeeFullName,EmployeeAge,EmployeeCountryName) select PersonId,PersonName,PersonAge,PersonCountryName from DemoTable1;
Query OK, 3 rows affected (0.26 sec)
Records: 3 Duplicates: 0 Warnings: 0
총 3개의 레코드가 성공적으로 삽입되었습니다. 결과를 확인해 보겠습니다.
mysql> select * from DemoTable2;
실행 결과는 다음과 같습니다.
+------------+------------------+-------------+---------------------+----------------+
| EmployeeId | EmployeeFullName | EmployeeAge | EmployeeCountryName | EmployeeSalary |
+------------+------------------+-------------+---------------------+----------------+
| 1 | Chris Brown | 24 | US | 20000 |
| 2 | John Doe | 26 | UK | 20000 |
| 3 | David Miller | 23 | AUS | 20000 |
+------------+------------------+-------------+---------------------+----------------+
3 rows in set (0.00 sec)
정리 및 주요 포인트
- INSERT INTO SELECT 문은 테이블 구조가 달라도 사용할 수 있으며, 대상 컬럼 목록을 명시하는 것이 핵심입니다.
- SELECT 절의 컬럼 순서와 데이터 타입은 대상 테이블에 지정한 컬럼과 호환되어야 합니다.
- 대상 테이블에 값을 제공하지 않은 컬럼(
EmployeeSalary)은 DEFAULT 값인 20000이 자동으로 적용됩니다. - WHERE 절을 추가하면 조건에 맞는 특정 행만 선택적으로 복사할 수도 있습니다.