반응형
악마같은 돌고래...
오늘은 실습 하던 중 발생한 에러에 대해 정리하려 한다.
Error Code: 1093.
You can't specify target table 'table_name' for update in FROM clause
에러사항
작업환경 : MySQL Workbench
실행코드 : DELETE FROM books WHERE sales = (SELECT MIN(sales) FROM books)
SELECT문, INSERT문, UPDATE문 실습하면서 아주 착착 잘 진행되었는데
DELETE문 실습하자마자 아래와 같은 에러가 발생했다.
에러내용 : Error Code: 1093. You can't specify target table 'Books' for update in FROM clause
에러를 해결하기 위해 이런저런걸 다 해보았지만 해결되진 않았다.
[에러 해결을 위해 시도한 것들]
1. 오타 확인 (컬럼명, 테이블명 오타가 있으면 잡아주지 않아서 하나하나 다 봤다.)
2. 대소문자 구분도 해봤다.
3. 어디 주석처리 안돼서 내 실행을 방해하는 코드는 없는지 확인
4. 강사님 예문코드 복붙 → 여기에서 당황 ??
여기까지 해보고도 안 돼서 구글링으로 해결했다
참고링크 : https://freedeveloper.tistory.com/490
에러원인
MySQL은 데이터를 추가(INSERT), 갱신(UPDATE), 삭제(DELETE)할 경우,
동일한 테이블의 값을 바로 사용할 수 없다.
이게 무슨 말이냐?
실행코드 : DELETE FROM books WHERE sales = (SELECT MIN(sales) FROM books)
위의 실행코드를 하나하나 뜯어보면
- DELETE FROM books : books 테이블에 있는 ~을 삭제해줘
- DELETE FROM books WHERE sales = : books 테이블에 있는 컬럼 sales의 값이 ~ 한 것을 삭제해줘
- DELETE FROM books WHERE sales = (SELECT MIN(sales) FROM books)
: books 테이블에 있는 컬럼 sales의 값이 (books 테이블에 있는 컬럼 sales의 값 중 가장 작은 것)과 같은 것을 삭제해줘
밑줄이 그어진 문장과 같이 동일한 테이블의 값을 서브쿼리로 사용할 수 없다는 것!
(* 단, Oracle이나 PostgreSQL에서는 문제 없이 실행된다고 한다.)
해결
서브쿼리를 괄호로 한 번 더 감싼 뒤 값을 사용해줘야한다.
(books는 books하게 해줘 → books는 (books)하게 해줘로 해주면 된다. 예시가 맞나?)
수정 전 코드)
DELETE FROM books WHERE sales = (SELECT MIN(sales) FROM books)
수정한 코드)
DELETE FROM books WHERE sales = (SELECT min FROM (SELECT MIN(sales) AS min FROM books) AS T)
1. (SELECT MIN(sales) AS min FROM books)의 결과 테이블 = 임시테이블
2. 임시테이블의 별칭을 T라고 붙여준다.(이건 잘 모르겠다 왜 있어야하는지... 안 붙이니까 에러남)↓
3. 임시테이블(=T)에서 min을 조회한다.
+ 왜 AS T 가 필요한가?
MySQL의 문법 규칙상, 서브쿼리를 사용하는 경우 해당 서브쿼리 결과에 이름을 붙이지 않으면 어떤 테이블 혹은 데이터 집합을 참조하는지 알 수 없게 된다. 즉, 서브쿼리를 사용할 때는 반드시 별칭이 필요하다는 것이다!!
* 여기서 AS T란? T라고 별칭을 지정하는 것!
출처 : ChatGPT
글을 정리하며...
아무리 봐도 맞는데...??? 앞구르기 하고 봐도 맞는데??
틀리지 않았는데? 강사님도 이렇게 하면 돼요~ 하고 다음문제로 넘어가셨는데...
강의를 자세히 보니 강사님은 코드를 실행하지 않으신것같다...!!!!!!!!!!!!!!!!!!!!!!!
직접 해결 해보려는 자세도 좋지만
웬만하면 에러 발생시 일단은 재빠르게 에러를 검색해보자!
아님 에러라도 자세히 읽어보자! 에러 속에 정답있다

반응형
댓글