Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 열 구조가 다른 테이블로 레코드 복사하기 – INSERT INTO SELECT 완벽 가이드

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 등의 절을 함께 사용하면 더욱 유연한 데이터 복사가 가능합니다.