MySQL에서 INSERT INTO ... SELECT 문을 활용하면 한 테이블의 최대(MAX) ID 값을 구한 뒤, 그 값을 다른 테이블의 모든 행에 한 번에 삽입할 수 있습니다. 서브쿼리를 SELECT 절 안에 배치하면 원본 테이블의 각 행마다 동일한 최대 ID 값이 반복해서 들어가게 됩니다.
1. 첫 번째 테이블 생성
먼저 예제로 사용할 테이블을 생성합니다.
mysql> create table DemoTable1
(
Id int,
Name varchar(100)
);
Query OK, 0 rows affected (0.86 sec)2. 샘플 데이터 삽입
INSERT 명령으로 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable1 values(1001,'Chris'); Query OK, 1 row affected (0.10 sec) mysql> insert into DemoTable1 values(999,'Robert'); Query OK, 1 row affected (0.13 sec) mysql> insert into DemoTable1 values(1003,'Mike'); Query OK, 1 row affected (0.17 sec) mysql> insert into DemoTable1 values(1002,'Sam'); Query OK, 1 row affected (0.13 sec)
SELECT 문으로 저장된 전체 레코드를 확인합니다.
mysql> select *from DemoTable1;
실행 결과는 다음과 같습니다.
+------+--------+ | Id | Name | +------+--------+ | 1001 | Chris | | 999 | Robert | | 1003 | Mike | | 1002 | Sam | +------+--------+ 4 rows in set (0.00 sec)
3. 두 번째 테이블 생성
데이터를 삽입할 대상 테이블을 만듭니다.
mysql> create table DemoTable2
(
StudentId int,
StudentFirstName varchar(100)
);
Query OK, 0 rows affected (1.15 sec)4. INSERT INTO ... SELECT로 최대 ID 값 삽입
핵심 쿼리입니다. SELECT 절 안에 (select Max(Id) from DemoTable1)이라는 스칼라 서브쿼리를 넣으면, DemoTable1의 각 행(Name)과 함께 최대 ID 값(1003)이 DemoTable2의 StudentId 컬럼에 반복 삽입됩니다.
mysql> insert into DemoTable2(StudentId,StudentFirstName) select (select Max(Id) from DemoTable1), Name from DemoTable1; Query OK, 4 rows affected (0.20 sec) Records: 4 Duplicates: 0 Warnings: 0
5. 결과 확인
DemoTable2의 전체 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable2;
모든 행의 StudentId에 첫 번째 테이블의 최대 ID 값인 1003이 동일하게 들어간 것을 확인할 수 있습니다.
+-----------+------------------+ | StudentId | StudentFirstName | +-----------+------------------+ | 1003 | Chris | | 1003 | Robert | | 1003 | Mike | | 1003 | Sam | +-----------+------------------+ 4 rows in set (0.00 sec)
정리
이처럼 MySQL에서는 INSERT INTO ... SELECT 문과 MAX() 집계 함수를 조합하면 별도의 애플리케이션 로직 없이 단일 쿼리만으로 한 테이블의 최대 ID 값을 다른 테이블의 모든 행에 손쉽게 복사할 수 있습니다. 참고로 이 방식은 원본 테이블의 행 수만큼 대상 테이블에 레코드가 생성되며, 각 레코드에는 동일한 최대 ID 값이 저장된다는 점을 기억하시기 바랍니다.