MySQL에서 특정 조건을 만족할 때만 데이터를 삽입하고 싶다면 DUAL 테이블과 NOT EXISTS 절을 함께 사용하는 방법이 효과적입니다. 이 글에서는 예제 테이블을 직접 만들어가며 조건부 삽입(Conditional Insert)의 개념과 실제 구현 방법을 단계별로 살펴보겠습니다.
1. 예제 테이블 생성
먼저 조건부 삽입 개념을 이해하기 위한 테이블을 생성합니다. 아래 쿼리를 실행해 보세요.
mysql> create table ConditionalInsertDemo
-> (
-> UserId int,
-> TotalUser int,
-> NumberOfItems int
-> );
Query OK, 0 rows affected (0.58 sec)
2. 샘플 데이터 삽입
INSERT 명령어를 사용해 테이블에 몇 개의 레코드를 추가합니다.
mysql> insert into ConditionalInsertDemo values(101,560,780);
Query OK, 1 row affected (0.19 sec)
mysql> insert into ConditionalInsertDemo values(102,660,890);
Query OK, 1 row affected (0.20 sec)
mysql> insert into ConditionalInsertDemo values(103,450,50);
Query OK, 1 row affected (0.15 sec)
3. 저장된 데이터 확인
SELECT 문으로 테이블의 모든 레코드를 조회합니다.
mysql> select *from ConditionalInsertDemo;
출력 결과
+--------+-----------+---------------+
| UserId | TotalUser | NumberOfItems |
+--------+-----------+---------------+
| 101 | 560 | 780 |
| 102 | 660 | 890 |
| 103 | 450 | 50 |
+--------+-----------+---------------+
3 rows in set (0.00 sec)
현재 테이블에는 3개의 레코드가 저장되어 있습니다.
4. DUAL 테이블을 활용한 조건부 삽입
이제 DUAL 테이블을 활용해 조건부 삽입을 수행해 보겠습니다. 아래 쿼리는 UserId=104이면서 NumberOfItems=3500인 레코드가 이미 테이블에 존재하지 않는 경우에만 새로운 데이터를 삽입합니다.
mysql> insert into ConditionalInsertDemo(UserId,TotalUser,NumberOfItems)
-> select 104,900,3500 from dual
-> WHERE NOT EXISTS (SELECT * FROM ConditionalInsertDemo
-> where UserId=104 and NumberOfItems=3500);
Query OK, 1 row affected (0.18 sec)
Records: 1 Duplicates: 0 Warnings: 0
쿼리가 성공적으로 실행되어 1개의 레코드가 삽입되었습니다.
5. 조건부 삽입 결과 확인
테이블을 다시 조회하여 레코드가 정상적으로 삽입되었는지 확인합니다.
mysql> select *from ConditionalInsertDemo;
출력 결과
+--------+-----------+---------------+
| UserId | TotalUser | NumberOfItems |
+--------+-----------+---------------+
| 101 | 560 | 780 |
| 102 | 660 | 890 |
| 103 | 450 | 50 |
| 104 | 900 | 3500 |
+--------+-----------+---------------+
4 rows in set (0.00 sec)
핵심 정리
이 기법의 핵심은 다음과 같습니다.
① DUAL 테이블: 실제 데이터 없이 SELECT 문을 실행할 수 있게 해주는 MySQL의 특수한 한 행짜리 가상 테이블입니다.
② NOT EXISTS 서브쿼리: 삽입하려는 값과 동일한 레코드가 이미 존재하는지 검사합니다.
③ 중복 방지: 조건이 충족될 때만 INSERT가 실행되므로, 동일한 데이터가 중복으로 들어가는 것을 효과적으로 막을 수 있습니다.
만약 같은 쿼리를 다시 실행하면 WHERE NOT EXISTS 조건에 의해 해당 레코드가 이미 존재하므로 아무것도 삽입되지 않습니다. 이처럼 DUAL 테이블과 NOT EXISTS를 조합하면 별도의 UNIQUE 제약 조건 없이도 애플리케이션 로직 차원에서 중복 삽입을 방지하는 안전한 조건부 INSERT를 구현할 수 있습니다.