특정 페이지내에서 특정 값이 존재할 때 이를 삭제하는 경우 만약 해당하는 특정 값이
A테이블의 PK이고, 외래키로 1:1 관계가 맺어져 있는 다른 복수개의 테이블에서 사용되고 있을 때,
삭제를 하게되면 참조 무결성으로 인해 오류가 발생한다.
따라서 이를 방지하기 위해 예를들어 만약 내가 특정 웹 페이지에서 특정한 값을 (행, 게시글, 댓글, 회원) 삭제할 때
삭제를 완료하기 전 즉, 삭제를 요청하는 순간 DB로부터 조회를 한 뒤 조건이 성립되면 삭제대신 메시지 등을 통해 사용자에게 알린 후 삭제를 방지한다.
우선 쿼리를 차근차근 설계한다.
특정값이 특정 테이블로부터 존재하는 쿼리는 count(*) 함수를 통해 조회할 수 있다.
WHERE 조건절에 값이 소속되어있는 컬럼을 기준으로 해당 값이 일치하는 조건을 건 후 count(*)를 조회해서 1 이상의 값이 나오면 해당 테이블에 값이 등록되어 있는 것이므로 값이 사용중임을 정의할 수 있다.
SELECT COUNT(*) FROM 테이블명 WHERE 컬럼명 = "값";
위와같이 쿼리를 작성하면 해당 값이 지정한 테이블로부터 등록되어있는 ROW행의 개수를 조회할 수 있다.
쿼리를 조금만 더 응용해 본다.
SELECT CASE WHEN COUNT(*) > 0 THEN 1 ELSE 0 FROM 테이블명 WHERE 컬럼명 = "값"
위와같이 쿼리를 작성했을때 ResultType을 boolean으로 지정한다면 1 혹은 0의 boolean타입으로 값 반환이 가능하다.
페이지의 기능을 예로 들어 어떠한 회원의 userID값을 어딘가에 등록시켜 종속시켰을때 해당 행을 함께 지워야 하는 경우 만약 사용자가 댓글 혹은 게시글을 작성했다면 보통의 경우는 CASCADE 옵션을 통해 함께 지워주는게 다반사이지만, 이것을 사용자에게 혹은 관리자에게 알리려 한다면 값이 사용되고있는 테이블을 찾아 각각의 개수를 조회한 뒤 0보다 큰 값이 나온다면 로직을 처리하는 쿼리를 작성해야한다.
이때, 테이블이 복수개라면 나온 값들을 모두 더했을때 0이면 어떠한 테이블에서도 사용하고 있지 않고, 0보다 크면 특정 테이블에서 사용중이므로 로직을 수행하도록 기능을 구현해야 한다.
위와같은 상황에서 사용할 수 있는 방법 중 하나는 집합 연산자 중 하나인 UNIONALL 연산자와 SUM() 함수이다.
UNIONALL을 기준으로 작성된 SELECT 질의문의 행들을 중복을 포함하여 결합한다.
결합 된 질의문으로 부터 sum() 함수를 통해 count를 샌 값들을 다시한번 합친다.
이때 결합된 질의문들의 각 count(*) 값들은 별칭을 지정한다.
또한 결합된 질의문 자체도 별칭을 지정하여 sum함수의 인자값에 질의문별칭명.개수별칭명 값을 넣는다.
쿼리문의 예시는 아래와 같다.
sum() 함수와 UNIONALL
SELECT sum(T.cnt)
FROM (
SELECT count(*) AS cnt
FROM 테이블명1
WHERE 테이블명1.컬럼명 = 값
UNIONALL
SELECT count(*) AS cnt
FROM 테이블명2
WHERE 테이블명2.컬럼명 = 값
UNIONALL
SELECT count(*) AS cnt
FROM 테이블명3
WHERE 테이블명3.컬럼명 = 값
UNIONALL
SELECT count(*) AS cnt
FROM 테이블명4
WHERE 테이블명4.컬럼명 = 값
) T;
'DataBase > My SQL' 카테고리의 다른 글
selectKey 짧은 설명과 사용 예시 (0) | 2022.04.14 |
---|---|
[MySql]DB 데이터 공백존재 컬럼 공백제거 REPACE() (0) | 2021.12.30 |
[MyBatis] 동적쿼리문 <if, choose, when, otherwise, sql, include> (if~then/elseif~then 사용불가) (0) | 2020.09.07 |
My SQL 설치 및 환경설정 - (정리예정) (0) | 2020.09.01 |