문제
DELETE나 UPDATE 사용할 때, 메인 쿼리에서 만들어낸 서브쿼리를 직접적으로 참조하면 에러가 발생한다.
DELETE FROM people WHERE name = (SELECT name FROM people WHERE name = 'PJY' LIMIT 1);
위의 SQL에서 에러가 발생했다.
해결
1. DELETE나 UPDATE 사용 시 서브쿼리를 사용하지 않는 방법
DELETE FROM people WHERE name = 'PJY' LIMIT 1;
- 서브쿼리를 사용하지 않는 편이 성능상으로나 쿼리 가독성으로나 더 좋은 방법이다.
- (+ LIMIT 거는 이유) 한번에 너무 많은 ROW를 삭제하면 데이터베이스에 부하가 가해지므로, 다른 트랜잭션이 처리되지 않아 데드락이 걸릴 수 있다. 이를 방지하기 위해 대량의 데이터를 지워야한다고 하더라도 LIMIT를 거는 것이 좋다.
2. 서브쿼리를 서브쿼리로 랩핑하는 방법
DELETE FROM people
WHERE
name = (SELECT
subquery.name
FROM
(SELECT
name
FROM
people
WHERE
name = 'PJY'
LIMIT 1) AS subquery) LIMIT 1;
- 서브 쿼리를 다른 서브 쿼리로 랩핑하여 하나의 ROW만 삭제하는 다소 억지스런 상황(?)을 구현한 것이다.
- 일단 이렇게 동작한다고 개념만 인지하려고 한다.
'했던것들 > MySQL' 카테고리의 다른 글
Error Code: 1175. safe update mode 해제 SQL문 (0) | 2023.07.31 |
---|---|
일대다(one to many) 관계 연습 (0) | 2023.07.30 |
데이터베이스(SQL) 도입하기 (0) | 2023.02.02 |