MySQL에서는 INSERT INTO SELECT 문을 활용하면 한 테이블의 행을 다른 테이블로 손쉽게 이동할 수 있습니다. 이 방법은 원본 테이블에서 데이터를 조회하여 대상 테이블에 그대로 삽입하는 방식으로 동작합니다.
기본 문법
행을 이동하는 기본적인 문법은 다음과 같습니다.
INSERT INTO 대상테이블명 SELECT * FROM 원본테이블명 WHERE 조건;
WHERE 절에 조건을 지정하면 특정 행만 선택적으로 이동할 수 있고, 조건을 생략하면 모든 행이 복사됩니다.
예제 테이블 생성
먼저 실습을 위해 두 개의 테이블을 만들어 보겠습니다. 첫 번째 테이블인 StudentTable을 생성하는 쿼리입니다.
mysql> CREATE TABLE StudentTable
-> (
-> Id INT,
-> Name VARCHAR(100)
-> );
Query OK, 0 rows affected (0.65 sec)다음으로 두 번째 테이블인 Employee를 생성합니다.
mysql> CREATE TABLE Employee
-> (
-> EmployeeId INT,
-> EmployeeName VARCHAR(100)
-> );
Query OK, 0 rows affected (0.54 sec)데이터 삽입
Employee 테이블에 샘플 레코드를 몇 개 삽입해 보겠습니다.
mysql> INSERT INTO Employee VALUES(1, 'Carol'); Query OK, 1 row affected (0.18 sec) mysql> INSERT INTO Employee VALUES(2, 'John'); Query OK, 1 row affected (0.16 sec) mysql> INSERT INTO Employee VALUES(3, 'Johnson'); Query OK, 1 row affected (0.11 sec)
SELECT 문으로 Employee 테이블의 전체 레코드를 확인합니다.
mysql> SELECT * FROM Employee;
실행 결과는 다음과 같습니다.
+------------+--------------+ | EmployeeId | EmployeeName | +------------+--------------+ | 1 | Carol | | 2 | John | | 3 | Johnson | +------------+--------------+ 3 rows in set (0.00 sec)
특정 행만 다른 테이블로 이동하기
앞서 소개한 문법을 적용하여 Employee 테이블의 특정 행을 StudentTable로 이동해 보겠습니다. 아래 쿼리는 EmployeeId가 3이고 이름이 'Johnson'인 행만 이동합니다.
mysql> INSERT INTO StudentTable SELECT * FROM Employee WHERE EmployeeId = 3 AND EmployeeName = 'Johnson'; Query OK, 1 row affected (0.17 sec) Records: 1 Duplicates: 0 Warnings: 0
이제 StudentTable에 해당 행이 정상적으로 들어갔는지 확인해 보겠습니다.
mysql> SELECT * FROM StudentTable;
실행 결과입니다.
+------+---------+ | Id | Name| +------+---------+ | 3 | Johnson | +------+---------+ 1 row in set (0.00 sec)
위 출력 결과를 보면 Johnson이라는 행이 성공적으로 다른 테이블로 이동한 것을 확인할 수 있습니다.
모든 행 한 번에 이동하기
원본 테이블의 모든 행을 이동하고 싶다면 WHERE 조건절만 제거하면 됩니다.
mysql> INSERT INTO StudentTable SELECT * FROM Employee; Query OK, 3 rows affected (0.15 sec) Records: 3 Duplicates: 0 Warnings: 0
StudentTable의 전체 레코드를 조회하여 결과를 확인합니다.
mysql> SELECT * FROM StudentTable;
실행 결과는 다음과 같습니다.
+------+---------+ | Id | Name | +------+---------+ | 1 | Carol | | 2 | John | | 3 | Johnson | +------+---------+ 3 rows in set (0.00 sec)
참고 사항
INSERT INTO SELECT는 데이터를 복사하는 방식이므로, 원본 테이블에서 해당 행을 삭제하려면 이동 작업 후 DELETE 문을 함께 실행해야 합니다. 또한 두 테이블의 컬럼 수와 순서가 일치해야 하며, 컬럼 구조가 다르다면 SELECT 절에서 컬럼을 명시적으로 지정하는 것이 안전합니다.