MySQL에서는 INSERT INTO ... SELECT 문을 활용하면 한 테이블의 데이터를 조회하면서 동시에 고정된 값(상수)을 함께 삽입할 수 있습니다. 예를 들어, 기존 직원 명단 테이블에서 이름만 가져오고, 나머지 컬럼에는 공통으로 적용되는 상숫값을 넣어야 하는 경우에 유용합니다.
아래 예제를 통해 단계별로 살펴보겠습니다.
1단계: 첫 번째 테이블 생성하기
먼저 이름 데이터를 담을 테이블을 생성합니다.
mysql> create table DemoTable1(Name varchar(100)); Query OK, 0 rows affected (0.83 sec)
2단계: 테이블에 레코드 삽입하기
insert 명령을 사용해 몇 개의 레코드를 추가합니다.
mysql> insert into DemoTable1 values('John');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable1 values('Chris');
Query OK, 1 row affected (0.10 sec)
mysql> insert into DemoTable1 values('Robert');
Query OK, 1 row affected (0.13 sec)3단계: 저장된 데이터 확인하기
select 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from DemoTable1;
위 쿼리를 실행하면 아래와 같은 결과가 출력됩니다.
+--------+ | Name | +--------+ | John | | Chris | | Robert | +--------+ 3 rows in set (0.00 sec)
4단계: 두 번째 테이블 생성하기
이번에는 상숫값과 직원 이름을 함께 저장할 두 번째 테이블을 만듭니다.
mysql> create table DemoTable2( ConstantValue int, EmployeeName varchar(100) ); Query OK, 0 rows affected (0.70 sec)
5단계: 상수와 병합하여 데이터 삽입하기
핵심은 INSERT INTO ... SELECT 구문입니다. select 절에서 상숫값 '1000'을 첫 번째 컬럼에 지정하고, DemoTable1에서 Name 값을 함께 선택하면 모든 행에 동일한 상수가 채워진 채로 삽입됩니다.
mysql> insert into DemoTable2(ConstantValue,EmployeeName) select '1000',Name from DemoTable1; Query OK, 3 rows affected (0.13 sec) Records: 3 Duplicates: 0 Warnings: 0
결과 확인하기
select 문으로 DemoTable2의 전체 레코드를 조회합니다.
mysql> select *from DemoTable2;
실행 결과는 다음과 같습니다.
+---------------+--------------+ | ConstantValue | EmployeeName | +---------------+--------------+ | 1000 | John | | 1000 | Chris | | 1000 | Robert | +---------------+--------------+ 3 rows in set (0.00 sec)
정리
이처럼 INSERT INTO ... SELECT 문의 select 절에 리터럴 값을 직접 작성하면, 원본 테이블의 데이터와 상수를 손쉽게 병합하여 새 테이블에 삽입할 수 있습니다. 일괄적으로 특정 값을 부여해야 하는 데이터 마이그레이션 작업에서 특히 유용한 기법이므로 꼭 익혀두시기 바랍니다.