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

MySQL에서 SELECT 결과를 INSERT 하는 방법 – VALUES 없이 데이터 복사하기

MySQL에서 SELECT 결과를 그대로 INSERT 할 수 있을까?

결론부터 말하면 가능합니다. MySQL에서는 INSERT INTO ... SELECT 구문을 사용하면 다른 테이블의 조회(SELECT) 결과를 그대로 새 테이블에 삽입할 수 있습니다. 이때 일반적인 INSERT 문처럼 VALUES 절을 사용할 필요가 전혀 없다는 점이 핵심입니다.

실제 동작 과정을 확인하기 위해 두 개의 테이블을 만들고, 두 번째 테이블의 데이터를 첫 번째 테이블로 복사해 보겠습니다.

1단계: 첫 번째 테이블 생성

먼저 데이터를 받아올 대상 테이블(FirstTableDemo)을 생성합니다.

mysql> create table FirstTableDemo
    -> (
    -> StudentId int,
    -> StudentName varchar(100)
    -> );
Query OK, 0 rows affected (0.41 sec)

2단계: 두 번째 테이블 생성

이어서 원본 데이터가 들어 있을 테이블(SecondTableDemo)을 만듭니다.

mysql> create table SecondTableDemo
    -> (
    -> Id int,
    -> Name varchar(100)
    -> );
Query OK, 0 rows affected (0.47 sec)

3단계: 두 번째 테이블에 레코드 삽입

일반적인 INSERT 문으로 샘플 데이터를 입력합니다.

mysql> insert into SecondTableDemo values(1,'John');
Query OK, 1 row affected (0.14 sec)

mysql> insert into SecondTableDemo values(2,'Sam');
Query OK, 1 row affected (0.27 sec)

4단계: 저장된 데이터 확인

SELECT 문으로 두 번째 테이블의 전체 레코드를 조회합니다.

mysql> select *from SecondTableDemo;

실행 결과는 다음과 같습니다.

+------+------+
| Id   | Name |
+------+------+
|    1 | John |
|    2 | Sam  |
+------+------+
2 rows in set (0.00 sec)

5단계: INSERT ... SELECT 문으로 데이터 복사

이제 INSERT INTO ... SELECT 구문을 사용해 두 번째 테이블의 모든 레코드를 첫 번째 테이블에 삽입합니다. 아래 쿼리에는 NOT IN 서브쿼리가 포함되어 있는데, 이는 이미 존재하는 StudentId와 중복되는 데이터가 삽입되지 않도록 방지하는 역할을 합니다.

mysql> insert into FirstTableDemo(StudentId,StudentName)
    -> select Id,Name from SecondTableDemo as tbl1
    -> where tbl1.Id not in (select StudentId from FirstTableDemo);
Query OK, 2 rows affected (0.57 sec)
Records: 2 Duplicates: 0 Warnings: 0

실행 결과를 보면 2개의 레코드가 성공적으로 삽입되었고, 중복(Duplicates)은 0건입니다.

6단계: 최종 결과 교차 검증

첫 번째 테이블을 다시 조회하여 데이터가 정상적으로 복사되었는지 확인합니다.

mysql> select *from FirstTableDemo;

실행 결과는 다음과 같습니다.

+-----------+-------------+
| StudentId | StudentName |
+-----------+-------------+
|         1 | John        |
|         2 | Sam         |
+-----------+-------------+
2 rows in set (0.00 sec)

INSERT ... SELECT 활용 팁

  • 테이블 간 데이터 복사: 백업 테이블을 만들거나, 운영 데이터를 통계용 테이블로 옮길 때 유용합니다.
  • 컬럼 개수 일치: SELECT 절에서 반환하는 컬럼의 개수와 순서는 INSERT 대상 컬럼 목록과 반드시 일치해야 하며, 데이터 타입도 호환되어야 합니다.
  • 중복 방지: 위 예제처럼 NOT IN, NOT EXISTS 또는 ON DUPLICATE KEY UPDATE 등을 함께 사용하면 중복 삽입을 효과적으로 막을 수 있습니다.
  • 대량 데이터 처리: VALUES 절로 한 건씩 넣는 것보다 INSERT ... SELECT가 서버 왕복 횟수가 적어 대량 데이터 처리 시 성능상 유리합니다.

이처럼 MySQL에서는 VALUES 절 없이도 SELECT 문의 결과를 그대로 다른 테이블에 삽입할 수 있습니다. 조건(WHERE), 정렬(ORDER BY), 조인(JOIN) 등 SELECT 문에서 사용할 수 있는 모든 기능을 그대로 활용할 수 있다는 점도 큰 장점입니다.