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. 이 발생할 경우 서브쿼리로 한번 감싸주는 작업을 생각해봐야 한다.
'우당탕탕 개발생활 > _Database' 카테고리의 다른 글
[MySQL] EXCEPT 기능 구현하기 (0) | 2022.01.19 |
---|---|
[MySQL] MsSQL의 FULL OUTER JOIN 사용하기 (0) | 2022.01.18 |
[MySQL] Access is denied 오류 해결 방법 (0) | 2022.01.06 |