개요
MySQL에서는 두 개의 테이블에 공통된 ID 값이 있을 때, 다중 테이블 UPDATE 문을 사용하여 한 테이블의 열 값을 다른 테이블로 손쉽게 복사할 수 있습니다. 이 글에서는 실제 예제를 통해 PersonId와 StudentId처럼 서로 다른 이름의 ID 열을 기준으로 값을 복사하는 방법을 단계별로 살펴봅니다.
1단계: 첫 번째 테이블 생성
먼저 원본 데이터가 담길 테이블을 생성합니다.
mysql> create table DemoTable1
(
PersonId int,
Value int
);
Query OK, 0 rows affected (0.64 sec)insert 명령을 사용하여 테이블에 레코드를 삽입합니다.
mysql> insert into DemoTable1 values(100,78); Query OK, 1 row affected (0.46 sec) mysql> insert into DemoTable1 values(101,67); Query OK, 1 row affected (0.14 sec) mysql> insert into DemoTable1 values(102,89); Query OK, 1 row affected (0.19 sec)
select 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable1;
실행 결과는 다음과 같습니다.
+----------+-------+ | PersonId | Value | +----------+-------+ | 100 | 78 | | 101 | 67 | | 102 | 89 | +----------+-------+ 3 rows in set (0.00 sec)
2단계: 두 번째 테이블 생성
값을 복사받을 대상 테이블을 생성합니다.
mysql> create table DemoTable2
(
StudentId int,
StudentScore int
);
Query OK, 0 rows affected (0.57 sec)이번에는 점수 열을 NULL로 남겨 둔 상태로 레코드를 삽입합니다.
mysql> insert into DemoTable2 values(100,NULL) ; Query OK, 1 row affected (0.20 sec) mysql> insert into DemoTable2 values(102,NULL); Query OK, 1 row affected (0.22 sec)
테이블의 모든 레코드를 조회합니다.
mysql> select *from DemoTable2;
실행 결과는 다음과 같습니다.
+-----------+--------------+ | StudentId | StudentScore | +-----------+--------------+ | 100 | NULL | | 102 | NULL | +-----------+--------------+ 2 rows in set (0.00 sec)
3단계: 일치하는 ID를 기준으로 열 값 복사하기
한 테이블의 열 값을 일치하는 ID를 기준으로 다른 테이블에 복사하는 쿼리는 다음과 같습니다. 핵심은 WHERE 절에서 두 테이블의 ID 열을 연결(조인 조건)하는 것입니다.
mysql> update DemoTable1, DemoTable2 set DemoTable2.StudentScore = DemoTable1.Value where DemoTable2.StudentId=DemoTable1.PersonId; Query OK, 2 rows affected (0.13 sec) Rows matched: 2 Changed: 2 Warnings: 0
위 쿼리는 MySQL의 다중 테이블 UPDATE 문법을 활용한 것으로, DemoTable2.StudentId와 DemoTable1.PersonId가 일치하는 행을 찾아 DemoTable1.Value 값을 DemoTable2.StudentScore에 대입합니다. 이 쿼리는 아래와 같이 INNER JOIN을 명시적으로 사용하는 방식과 동일하게 동작합니다.
update DemoTable2 inner join DemoTable1 on DemoTable2.StudentId = DemoTable1.PersonId set DemoTable2.StudentScore = DemoTable1.Value;
결과 확인
업데이트 후 테이블의 레코드를 다시 조회해 보겠습니다.
mysql> select *from DemoTable2;
NULL이었던 StudentScore 열에 DemoTable1의 Value 값이 성공적으로 복사된 것을 확인할 수 있습니다.
+-----------+--------------+ | StudentId | StudentScore | +-----------+--------------+ | 100 | 78 | | 102 | 89 | +-----------+--------------+ 2 rows in set (0.00 sec)
정리
MySQL에서는 UPDATE 문에 여러 테이블을 나열하고 WHERE 절로 조인 조건을 지정하면, 한 테이블의 열 값을 일치하는 ID를 가진 다른 테이블의 행에 간편하게 복사할 수 있습니다. 참고로 이 방식은 내부적으로 INNER JOIN처럼 동작하므로, 조인 조건에 맞지 않는 대상 테이블의 행은 업데이트되지 않고 그대로 유지됩니다.