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

MySQL에서 한 테이블의 행을 다른 테이블로 이동하는 방법

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 절에서 컬럼을 명시적으로 지정하는 것이 안전합니다.