SQL - INSERT INTO WHERE NOT EXISTS

SQL에서 INESERT문을 작성할 때 해당 테이블에 특정 데이터가 없을 때에만 값을 집어넣는 쿼리문을 짜야할 때가 있다.

이때 자연스럽게 작성되는 문장으로

 

INSERT INTO TBL(col1, col2, col3) VALUSE(col1val, col2val, col3val) WHERE NOT EXISTS SELECT(없어야 할 데이터값 조회 조건)

 

뭐이런식으로 작성할 수 있는데 이때 VALUES를 지원하지 않는 문제가 있는것 같다.

 

 

SQL - 더미 테이블 DUAL

DUAL이라는 더미 테이블 즉, 가상의 테이블을 통해서 함수에 대한 쓰임을 알고 싶은데 특정 테이블을 생성하기 귀찮은 경우가 있는데 이때 DUAL테이블을 이용할 수도 있고 이 포스팅에서는 INSERT문에서 VALUES 대신에 사용하기도 한다.

 

한마디로 가상의 테이블이라고 생각할 수 있다.  아래의 예시를 보자

SELECT LAST_DAY( NOW() ) FROM DUAL;
SELECT LAST_DAY( NOW() );

위처럼 DB안에 아무 테이블이 없어도 SELECT이 동작하는데 이것이 DUAL 더미테이블 덕분이며 

MySQL에서는 생략할 수 있다.

 

하지만 오늘 살펴볼 NSERT문에다가 사용할 때는 생략해서는 안되는 것 같다. (생략하고 실행해보니 오류발생) 

 

그럼 INSERT INTO WHERE NOT EXSTIS 구문에는 어떻게 사용하는지 아래의 예시를 보도록하자.

INSERT INTO SERVER_RESOURCE_INFO(date, static_cpu_usage, static_cpu_max, static_mem_usage, static_mem_max, static_disk_usage, static_disk_usage_amount, flag)
SELECT #{date}, #{static_cpu_usage}, #{static_cpu_max}, #{static_mem_usage}, #{static_mem_max}, #{static_disk_usage}, #{static_disk_usage_amount}, "month" FROM DUAL
WHERE NOT EXISTS (SELECT * FROM SERVER_RESOURCE_INFO WHERE date=#{date} AND flag="month");

 위 쿼리에서 보이는 것처럼 values 대신에 select from dual 이라는 문장을 사용하고 이때 select 문에는 () 괄호를 사용하지 않는다.

 

MySQL 기준으로는 이러한 방식으로 Insert문을 작성하여 개발자가 원하는대로 특정 데이터가 없을 때에만

값을 집어넣는 쿼리문을 작성할 수 있다.