Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 테이블이 비어 있을 때만 INSERT 쿼리 실행하는 방법

MySQL에서 테이블에 데이터가 전혀 없는 경우, 즉 테이블이 비어 있을 때만 INSERT 문을 실행하고 싶다면 서브쿼리(subquery)NOT EXISTS 조건을 함께 사용하면 됩니다.

기본 문법

아래 문법은 오직 테이블이 비어 있을 때만 레코드를 삽입합니다. 만약 테이블에 이미 데이터가 하나라도 존재한다면 아무런 레코드도 추가되지 않습니다.

INSERT INTO yourTableName(yourColumnName)
SELECT 'anyValue'
WHERE NOT EXISTS (SELECT * FROM yourTableName);

예제로 이해하기

먼저 실습용 테이블을 생성해 보겠습니다. 테이블 생성 쿼리는 다음과 같습니다.

mysql> create table ExecuteInsertDemo
    -> (
    -> Name varchar(20)
    -> );
Query OK, 0 rows affected (0.67 sec)

이제 INSERT 명령으로 테이블에 레코드를 하나 삽입합니다.

mysql> insert into ExecuteInsertDemo values('John');
Query OK, 1 row affected (0.19 sec)

테이블에 데이터가 있는 경우의 동작 확인

현재 테이블에는 'John'이라는 레코드 하나가 들어 있어 비어 있지 않은 상태입니다. 이 상태에서 앞서 소개한 INSERT 쿼리를 실행하면 MySQL은 새로운 레코드를 삽입하지 않습니다.

mysql> insert into ExecuteInsertDemo(Name)
   -> select 'Larry'
   -> where not exists (select * from ExecuteInsertDemo);
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0

SELECT 문으로 테이블 내용을 조회해 보면 다음과 같습니다.

mysql> select * from ExecuteInsertDemo;

실행 결과:

+------+
| Name |
+------+
| John |
+------+
1 row in set (0.00 sec)

'Larry'가 삽입되지 않고 기존의 'John' 레코드만 그대로 남아 있는 것을 확인할 수 있습니다.

테이블을 비운 후 다시 실행

위 쿼리가 정상적으로 동작하는 것을 확인하려면 먼저 테이블의 레코드를 삭제해야 합니다. TRUNCATE 명령을 사용하면 테이블의 모든 데이터를 빠르게 삭제할 수 있습니다.

mysql> truncate table ExecuteInsertDemo;
Query OK, 0 rows affected (1.10 sec)

이제 테이블이 비어 있는 상태에서 동일한 INSERT 쿼리를 다시 실행합니다.

mysql> insert into ExecuteInsertDemo(Name)
   -> select 'Larry'
   -> where not exists (select * from ExecuteInsertDemo);
Query OK, 1 row affected (0.33 sec)
Records: 1 Duplicates: 0 Warnings: 0

SELECT 문으로 결과를 확인합니다.

mysql> select * from ExecuteInsertDemo;

실행 결과:

+-------+
| Name  |
+-------+
| Larry |
+-------+
1 row in set (0.00 sec)

출력 결과를 보면 테이블이 비어 있었기 때문에 'Larry'가 성공적으로 삽입된 것을 알 수 있습니다.

정리

이처럼 WHERE NOT EXISTS (SELECT * FROM 테이블명) 조건을 활용하면 테이블이 완전히 비어 있을 때만 초기 데이터를 삽입하는 로직을 SQL 한 문장으로 간단하게 구현할 수 있습니다. 시드(seed) 데이터 삽입이나 초기화 스크립트 작성 시 유용하게 활용할 수 있습니다.