본문 바로가기
우당탕탕 개발생활/_Database

[MySQL] Error Code: 1093. 해결방법 _DELETE문

by J-2n 2021. 12. 21.

Mysql version : 5.7

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

현재 프로젝트에서 MsSQL 에서 MySQL로 포팅작업을 한참 하고 있는데 MySQL로 쿼리문을 만들던 도중 1093 오류가 발생했다.

이 오류는 DELETE 문 수행중에 발생했고, INSERT, UPDATE 문에서도 발생한다고 한다. DELETE를 하려는 테이블의 값을 서브 쿼리에 대입하다 보니 발생하는 것 같다.


다음은 오류가 발생되던 쿼리이다.

DELETE A
FROM DATA_PERMISSION A
WHERE USER_ID = ''
  AND TYPE_CD = '22'
  AND NOT EXISTS (
                     SELECT 1
                      FROM T_BRANCH_MID B
                      INNER JOIN DATA_PERMISSION SA
                          ON B.TOP_CD = SA.DATA_VALUE
                        AND SA.USER_ID = ''
                        AND SA.TYPE_CD = '21'
                    WHERE B.MID_CD = A.DATA_VALUE
  )

 

이런식으로 DELETE 하려는 TABLE DATA_PERMISSION의 DATA_VALUE 값을 대입하려다 보니 오류가 발생되는것이다.

MySQL은 오라클과 유사하지만 이런 오류면에서는 신경쓸게 더 많은 것 같다.

위와 같이 발생되는 오류는 아래와 같이 해결했다.

 

DELETE A
FROM DATA_PERMISSION A
WHERE USER_ID = ''
  AND TYPE_CD = '22'
  AND NOT EXISTS (
		SELECT 1
		  FROM (
                        SELECT MID_CD
                        FROM T_BRANCH_MID B
                        INNER JOIN DATA_PERMISSION SA
                        ON B.TOP_CD = SA.DATA_VALUE
                        AND SA.USER_ID = ''
                        AND SA.TYPE_CD = '21'
		) S 
		 WHERE S.MID_CD = A.DATA_VALUE
)

 

위 코드와 같이 조회할 쿼리를 불러온 다음에 서브쿼리로 한번 감싸준 후 오류가 발생되는 TABLE DATA_PERMISSION의 값을 불러올 때 서브쿼리로 감싸둔 값과 비교하도록 했다.

이 후 오류는 발생되지 않고 쿼리가 실행되었다.


결론.

Error Code: 1093. 이 발생할 경우 서브쿼리로 한번 감싸주는 작업을 생각해봐야 한다.