본 포스트는 MySQL에서 UPDATE나 DELETE를 하려고 할 때 발생하는 에러(오류코드 1093)에 대한 설명입니다. 상세 오류 메시지는 You can't specify target table 'TABLE' for update in FROM clause 와 같이 표시됩니다.

 

오라클이나 티베로 등에서는  아래와 같은 Query가 잘 동작합니다.

UPDATE  TBP_STAGE_HIST
   SET  COMPLETE = 'Y'
 WHERE  ST_DTM = 
     (  SELECT  MAX(ST_DTM)
          FROM  TBP_STAGE_HIST)

위 예시에는 UPDATE를 사용했지만 DELETE 역시 잘 동작합니다. 하지만 MySQL에서는 1093 에러 코드를 리턴합니다. 내용을 보면 You can't specify target table 'TABLE' for update in FROM clause 로, UPDATE나 DELETE 작업을 수행할 때 자기 자신을 직접 참조할 수 없도록 합니다.

 

위의 경우 해결은 간단합니다. Sub Query에 자기 자신을 사용할 경우 인라인 뷰 형태로 만들어서 사용하시면 됩니다. 위의 Query를 수정하면 아래와 같은 방식입니다.

UPDATE  TBP_STAGE_HIST
   SET  COMPLETE = 'Y'
 WHERE  ST_DTM =
     (  SELECT  ST_DTM
          FROM (SELECT  MAX(ST_DTM) ST_DTM
                  FROM  TBP_STAGE_HIST) A
     )

 

300x250

'DB' 카테고리의 다른 글

[Oracle, Tibero] 테이블 레이아웃 조회  (0) 2022.07.11

오라클이나 티베로에서는 아래와 방법으로 테이블 목록을 조회할 수 있습니다.

 

 

SELECT  A.OWNER
     ,  A.TABLE_NAME
     ,  A.TABLESPACE_NAME
     ,  B.COMMENTS
  FROM  DBA_TABLES A
     ,  DBA_TAB_COMMENTS B
 WHERE  A.OWNER = B.OWNER
   AND  A.TABLE_NAME = B.TABLE_NAME
   AND  A.OWNER = ?

 

DBA_TABLES는 테이블에 대한 메타 정보이고, DBA_TAB_COMMENTS는 테이블의 코멘트에 대한 메타 정보입니다. 두 가지 정보를 조합하면 아래와 같이 현재 OWNER 소유의 테이블 목록을 구할 수 있습니다. (코멘트는 테이블에 대한 코멘트입니다)

OWNER TABLE_NAME TABLESPACE_NAME COMMENTS
TEST_OWNER TABLE_A TBLSPC_01 사용자 테이블
TEST_OWNER TABLE_B TBLSPC_01 부서 테이블
TEST_OWNER TABLE_C TBLSPC_02 로그 테이블
TEST_OWNER TABLE_D TBLSPC_02 권한 테이블
TEST_OWNER TABLE_E TBLSPC_02 사용자별 권한 테이블

 

또 다른 메타 정보를 이용하면 테이블의 컬럼 목록도 조회할 수 있습니다.

SELECT  A.OWNER
     ,  A.TABLE_NAME
     ,  B.COMMENTS
     ,  A.COLUMN_NAME
     ,  C.COMMENTS
     ,  A.DATA_TYPE
     ,  A.DATA_LENGTH
  FROM  DBA_TAB_COLS A
     ,  DBA_TAB_COMMENTS B
     ,  DBA_COL_COMMENTS C
 WHERE  A.OWNER = B.OWNER
   AND  A.TABLE_NAME = B.TABLE_NAME
   AND  A.OWNER = C.OWNER
   AND  A.TABLE_NAME = C.TABLE_NAME
   AND  A.COLUMN_NAME = C.COLUMN_NAME
   AND  A.OWNER = ?
   AND  A.TABLE_NAME = ?

DBA_TAB_COLS는 테이블 별 컬럼에 대한 메타 정보이고, DBA_COL_COMMENTS는 컬럼의 코멘트에 대한 메타 정보입니다. 특정 OWNER에 속하는 모든 테이블의 정보를 조회하고 싶으면 A.OWNER 조건만 주면 되고, 특정 테이블에 대한 정보를 조회하고 싶으면 A.TABLE_NAME 조건도 사용하시면 됩니다.

300x250

+ Recent posts