UPDATE 문을 사용하려는데 아래와 같은 Error를 맞닥뜨릴 수 있다.
Error Code: 1093. You can't specify target table '테이블명' for update in FROM clause
요점 부터 이야기하면 UPDATE 문 WHERE절에 조건을 서브쿼리로 실행하려고 할 경우
UPDATE 문의 대상이 되는 테이블을 서브쿼리의 대상이 되는 테이블로 사용할 수 없기 때문에 발생하는 문제다.
즉 UPDATE 하려는 테이블(자기자신)을 서브쿼리의 테이블로 지정할 수 없다는 이야기다.
UPDATE
TB_BOOK
SET
bookmark = concat(bookmark, concat(",",`책갈피에 저장할 페이지의 인덱스 값`))
WHERE
book_idx = (SELECT
A.book_idx
FROM
TB_BOOK_PAGE A
LEFT JOIN
TB_BOOK B ON (A.book_idx = B.book_idx)
WHERE
book_page_idx = `책갈피에 저장할 페이지의 인덱스 값`)
예를 들어 책의 정보가 담긴 테이블이 있고 하위 개념으로 해당 책의 각 페이지들의 정보가 담긴
테이블이 있는 형태로 설계된 DB구조가 있다고 가정하고
특정 페이지를 책갈피에 저장하려고 책 테이블의 bookmark 라는 컬럼에
누적저장 방식으로 책의 페이지를 넣으려고 하고
UPDATE 문의 파라미터 값이 해당 페이지의 index = 페이지 number 였을 때
위 처럼 UPDATE문을 작성하였는데 실행이 되지 않는다.
이런 경우에는 아래 처럼 서브쿼리를 임시 테이블로 한번더 감싸주면 된다.
UPDATE
TB_BOOK
SET
bookmark = concat(bookmark, concat(",",`책갈피에 저장할 페이지의 인덱스 값`))
WHERE
book_idx = (SELECT
tb_temp.book_idx
FROM
(SELECT
A.book_idx
FROM
TB_BOOK_PAGE A
LEFT JOIN
TB_BOOK B ON (A.book_idx = B.book_idx)
WHERE
book_page_idx = `책갈피에 저장할 페이지의 인덱스 값`) AS tb_temp)
최근댓글