MySQL에서는 INSERT INTO 명령에 WHERE 절을 결합하여 '조건부 삽입(Conditional Insert)'을 수행할 수 있습니다. 이 기법은 새로운 행을 삽입할 때 특정 조건이 참인 경우에만 데이터가 저장되도록 제어하고 싶을 때 유용합니다. 주로 다음 두 가지 방식으로 활용할 수 있습니다.
1. 더미 테이블(DUAL)을 활용한 조건부 삽입
첫 번째 방법은 MySQL의 내장 더미 테이블인 dual을 사용하는 것입니다. 직접 값을 지정하면서 동시에 WHERE 절로 조건을 걸어, 조건이 참일 때만 해당 값이 테이블에 삽입되도록 할 수 있습니다. 기본 문법은 다음과 같습니다.
INSERT INTO table_name(column1, column2, column3, …)
SELECT value1, value2, value3, …
FROM dual
WHERE [조건식];
예제
mysql> CREATE TABLE testing(id INT, item_name VARCHAR(10));
Query OK, 0 rows affected (0.15 sec)
mysql> INSERT INTO testing(id, item_name)
SELECT 1, 'Book' FROM dual WHERE 1=1;
Query OK, 1 row affected (0.11 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM testing;
+------+-----------+
| id | item_name |
+------+-----------+
| 1 | Book |
+------+-----------+
1 row in set (0.00 sec)
위 예제에서는 먼저 'testing'이라는 테이블을 생성한 뒤, 더미 테이블 dual과 WHERE 절(여기서는 항상 참인 1=1)을 함께 사용하여 행을 삽입했습니다. 조건식이 참으로 평가되면 MySQL은 해당 행을 테이블에 저장하고, 거짓이면 아무것도 삽입하지 않습니다.
2. 동일한 구조를 가진 테이블 간 조건부 삽입
두 번째 방법은 구조가 서로 같은 두 테이블 사이에서 조건에 맞는 데이터만 선택적으로 복사하는 방식입니다. 한 테이블에서 조회한 결과를 WHERE 절로 필터링하여 다른 테이블에 삽입하는 형태입니다.
예제
mysql> INSERT INTO dummy1(id, name)
SELECT id, name FROM dummy WHERE id = 1;
Query OK, 1 row affected (0.06 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM dummy;
+------+--------+
| id | Name |
+------+--------+
| 1 | Gaurav |
| 2 | Aarav |
+------+--------+
2 rows in set (0.00 sec)
mysql> SELECT * FROM dummy1;
+------+--------+
| id | Name |
+------+--------+
| 1 | Gaurav |
+------+--------+
1 row in set (0.00 sec)
위 예제에서 'dummy1' 테이블은 'dummy' 테이블과 동일한 구조를 가지고 있습니다. INSERT ... SELECT 문에 WHERE id = 1이라는 조건을 추가했기 때문에, 원본 테이블에 두 개의 행이 있더라도 id가 1인 행('Gaurav')만 대상 테이블에 삽입된 것을 확인할 수 있습니다.
정리
이처럼 INSERT INTO 문은 SELECT와 WHERE 절을 조합하면 단순히 데이터를 추가하는 것을 넘어, 조건에 따라 삽입 여부를 유연하게 제어할 수 있습니다. 중복 데이터 방지, 특정 조건의 레코드만 마이그레이션하는 등의 상황에서 실무적으로 매우 유용하게 활용됩니다.