했던것들/MySQL

Error Code: 1093. You can't specify target table 'people' for update in FROM clause

2DC 2023. 7. 29. 14:22

문제

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만 삭제하는 다소 억지스런 상황(?)을 구현한 것이다.
  • 일단 이렇게 동작한다고 개념만 인지하려고 한다.