반응형
- 나의 상황
: 등록/수정 요청 시, 키 값이 아닌 다른 컬럼의 중복여부를 체크하여 등록/수정 처리를 해줘야했음.
중복여부를 먼저 체크한 다음, 그 결과에 따라 등록요청을 한다면 서버에서 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 로 한번 더 감싸주어서 해결했다.
반응형
'개발 > DB' 카테고리의 다른 글
[MyBatis] Insert 후 Key 값 받아오기 (selectKey) (1) | 2022.11.03 |
---|---|
[MySQL] mysql 에서 sequence 기능 nextval 사용하기. (0) | 2022.10.26 |
intelliJ 에서 springboot + cubrid 연결 시 만난 에러 : java.lang.UnsupportedOperationException] with root cause (1) | 2022.07.26 |
MyBatis 대량 데이터 INSERT - SqlSessionFactory 이용! (2) | 2022.04.07 |
[Oracle] 대량 데이터 insert 하기. UNION ALL 사용. (1) | 2022.02.21 |