다른 테이블의 데이터를 새 테이블로 복사할 때 중복된 값을 제거하고 고유한(distinct) 레코드만 삽입해야 하는 경우가 있습니다. 이럴 때 INSERT INTO ... SELECT 문에 DISTINCT 키워드를 함께 사용하면 간단하게 해결할 수 있습니다.
1. 첫 번째 테이블 생성
먼저 예제에 사용할 테이블을 만들어 보겠습니다.
mysql> create table DemoTable1
(
Value int
);
Query OK, 0 rows affected (1.03 sec)
2. 샘플 데이터 삽입
INSERT 명령을 사용해 일부 레코드를 삽입합니다. 의도적으로 중복 값(50, 10)을 포함시켰습니다.
mysql> insert into DemoTable1 values(50); Query OK, 1 row affected (0.18 sec) mysql> insert into DemoTable1 values(10); Query OK, 1 row affected (0.12 sec) mysql> insert into DemoTable1 values(10); Query OK, 1 row affected (0.10 sec) mysql> insert into DemoTable1 values(60); Query OK, 1 row affected (0.11 sec) mysql> insert into DemoTable1 values(50); Query OK, 1 row affected (0.09 sec) mysql> insert into DemoTable1 values(70); Query OK, 1 row affected (0.10 sec) mysql> insert into DemoTable1 values(50); Query OK, 1 row affected (0.14 sec)
3. 테이블 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select *from DemoTable1;
실행 결과는 다음과 같습니다.
+-------+ | Value | +-------+ | 50 | | 10 | | 10 | | 60 | | 50 | | 70 | | 50 | +-------+ 7 rows in set (0.00 sec)
위 결과에서 볼 수 있듯이 총 7개의 행 중 50은 3번, 10은 2번 반복되어 있습니다.
4. 두 번째 테이블 생성
이제 데이터를 삽입할 두 번째 테이블을 생성합니다.
mysql> create table DemoTable2
(
Marks int
);
Query OK, 0 rows affected (1.20 sec)
5. DISTINCT를 사용해 중복 없이 여러 행 삽입
다음 쿼리는 다른 테이블에서 여러 행을 가져와 삽입하되, DISTINCT 덕분에 중복 없이 고유한 값만 저장됩니다.
mysql> insert into DemoTable2(Marks) select distinct Value from DemoTable1; Query OK, 4 rows affected (0.18 sec) Records: 4 Duplicates: 0 Warnings: 0
실행 결과를 보면 원본 테이블의 7개 행 중 중복이 제거된 4개의 고유한 값만 삽입된 것을 확인할 수 있습니다.
6. 최종 결과 확인
SELECT 문으로 두 번째 테이블의 모든 레코드를 조회합니다.
mysql> select *from DemoTable2;
실행 결과는 다음과 같습니다.
+-------+ | Marks | +-------+ | 50 | | 10 | | 60 | | 70 | +-------+ 4 rows in set (0.00 sec)
정리
이처럼 INSERT INTO ... SELECT DISTINCT 구문을 활용하면 한 테이블에서 다른 테이블로 데이터를 복사할 때 자동으로 중복을 제거하고 고유한 레코드만 삽입할 수 있습니다. 대량의 데이터를 마이그레이션하거나 테이블 정규화 작업을 진행할 때 특히 유용하게 활용할 수 있는 기법입니다.