본문 바로가기
database

MySQL Error [1093]: You can't specify target table 테이블명 for update in FROM clause

by cactuslog 2024. 3. 16.

 

에러 원인

MySQL은 UPDATE, DELETE의 경우 SELECT와 달리 자기 테이블의 데이터를 바로 사용할 수 없다.

 

 

상황

A 카테고리에서 1등 게시글의  포인트 점수와, B 카테고리에서 1등 게시글의 포인트의 차이를 계산해서 gap column을 업데이트 하고 싶다.

 

 

테이블 정의

CREATE TABLE post
(
    id         BIGINT AUTO_INCREMENT
        PRIMARY KEY,
    category   VARCHAR(1) NOT NULL,
    today_rank BIGINT     NOT NULL,
    point      INT        NOT NULL,
    gap        INT        NULL
);

 

 

에러 발생 쿼리

UPDATE post
SET gap = point - (SELECT point
                   FROM post
                   WHERE category = 'B'
                     AND today_rank = 1)
WHERE category = 'A'
  AND today_rank = 1;

 


해결

 

한번더 SELECT 절로 감싸서 Sub Query를 추가한다.

UPDATE post
SET gap = point - (SELECT point
                   FROM (SELECT point
                         FROM post
                         WHERE category = 'B'
                           AND today_rank = 1) AS p)
WHERE category = 'A'
  AND today_rank = 1;

 

 

 

'database' 카테고리의 다른 글

ubuntu에 mysql 설치하기  (0) 2024.11.18
MySQL Error [1248]: Every derived table must have its own alias  (0) 2024.03.16