SQL에서 INESERT문을 작성할 때 해당 테이블에 특정 데이터가 없을 때에만 값을 집어넣는 쿼리문을 짜야할 때가 있다.
이때 자연스럽게 작성할법 한 SQL은
INSERT INTO TBL(col1, col2, col3) VALUSE(col1val, col2val, col3val)
WHERE NOT EXISTS SELECT(없어야 할 데이터값 조회 조건)
무의식적으로 위와 같이 작성해볼 수 도 있을 것이다. (내가 그랬음..)
하지만 SQL에서 INSERT INTO ... VALUES ... 문법은 구조상 WHERE 절을 직접 붙일 수 없다는 제약이 존재한다.
[ 해결 방법 ] - 더미 테이블 DUAL 테이블을 사용하기
INSERT INTO ... SELECT ... FROM DUAL WHERE NOT EXISTS ... 패턴
DUAL이라는 더미 테이블 즉, 가상의 테이블을 통해서 함수에 대한 쓰임을 알고 싶은데 특정 테이블을 생성하기 귀찮은 경우가 있는데 이때 DUAL테이블을 이용할 수도 있고 이번 포스팅에서 말하고자 하는 것처럼 INSERT문에서 VALUES 대신에 사용하기도 한다.
한마디로 가상의 테이블이라고 생각할 수 있다. 아래의 예시를 보자
SELECT LAST_DAY( NOW() ) FROM DUAL;
SELECT LAST_DAY( NOW() );
위처럼 DB안에 아무 테이블이 없어도 SELECT이 동작하는데 이것이 DUAL 더미테이블 덕분이며
MySQL에서는 생략할 수 있다.
하지만 오늘 살펴볼 INSERT문에다가 사용할 때는 생략해서는 안된다.
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문을 작성하여 개발자가 원하는대로 특정 데이터가 없을 때에만
값을 집어넣는 쿼리문을 작성할 수 있다.
'DB + SQL' 카테고리의 다른 글
| SQL ERROR 1005 Foreign key constraint is incorrectly formed 에러 원인 (0) | 2023.02.16 |
|---|---|
| Mysql DB - 접속원리 (0) | 2022.12.21 |
| MySQL - 매월 마지막일, 매월 첫일 구하기 (0) | 2022.03.30 |
| [DB] 데이터베이스 정규화란? (0) | 2021.12.09 |
| [DB] 데이터 모델링이란? (0) | 2021.12.09 |
