본문 바로가기

개발/DB

[MySQL] not exists, exists 사용하여 insert/update 하기.

반응형

- 나의 상황

: 등록/수정 요청 시, 키 값이 아닌 다른 컬럼의 중복여부를 체크하여 등록/수정 처리를 해줘야했음.

중복여부를 먼저 체크한 다음, 그 결과에 따라 등록요청을 한다면 서버에서 db로 쿼리를 두 번 요청해야하는데..

다른 방법이 없을까 고민하다가 찾은 것! NOT EXISTS !!!

* 나는 중복되지 않도록 존재하지 않을 때인 NOT EXISTS 를 사용했는데, 존재할때 무언가 넣고싶다면 EXISTS 를 사용하면 된다. 

- 사용방법 

1. insert

INSERT INTO TEST_TABLE
( col1, col2, col3) 
SELECT 'col1Val', 'col2Val', 'col3Val' FROM DUAL
WHERE NOT EXISTS (select * from TEST_TABLE where col2 = 'col2Val')

//NOT EXISTS 를 사용하여 서브쿼리의 결과값이 없을때만 위의 insert 쿼리를 실행한다.

 

2. update

//MySQL 인 경우
UPDATE TEST_TABLE 
	SET COL_1 = 'A-01' 
    WHERE KEY_COL = 1 
    AND NOT EXISTS (
    	SELECT * 
        FROM (SELECT * FROM TEST_TABLE
                WHERE COL_1 = 'A-01' 
                AND KEY_COL != 1        # 중복 체크시, 본인의 경우는 제외하기위한 조건.
                ) A
         );       
         
  //ORACLE, Postgrest 인 경우
  UPDATE TEST_TABLE 
	SET COL_1 = 'A-01' 
    WHERE KEY_COL = 1 
    AND NOT EXISTS (
    	SELECT * FROM TEST_TABLE
            WHERE COL_1 = 'A-01' 
            AND KEY_COL != 1
         );

* mysql 의 경우 insert,update,delete 시에 동일한 테이블을 서브쿼리로 값을 가져오면 에러가 발생한다. (You can't specify target table 'TEST_TABLE' for update in FROM clause 이런 에러가 난다..)

그래서 위와 같이 select * from (select * from TEST_TABLE ~~ ) A 로 한번 더 감싸주어서 해결했다. 

 

반응형