본 포스트는 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
)
설치 과정은 별로 특별할 것이 없으므로 별도로 설명하지 않습니다. 설치 과정 중 MySQL root 계정을 설정하는 부분이 있는데 본인이 사용할 root 계정을 정확하게 입력하고 기억합니다.
접속정보 설정
설치가 완료되었다면 MySQL Workbench를 켜고 일단 root 계정으로 접속합니다.
MySQL Workbench
위 스크린 샷의 MySQL Connections 부분에 [+] 버튼을 클릭하여 새로운 Connection을 하나 생성하는데, 계정의 비밀번호를 Keychain에 저장하고 싶으면 [Store in Keychain ...] 버튼을 클릭하여 비밀번호를 기억시켜 둡니다. 여기서는 굳이 비밀번호는 저장하지 않겠습니다.
새 Connection 생성
식별할 수 있는 Connection Name과 접속 정보를 확인한 후 [OK] 버튼을 선택하면 아래와 같이 Connection이 하나 생성됩니다.
Connection 생성 확인
선택하고 비밀번호를 입력하여 root 계정으로 로그인 합니다.
데이터베이스 접속
데이터베이스 생성
이제 사용할 데이터베이스 및 사용자를 하나씩 생성해 보겠습니다. 먼저 아래 스크립트로 데이터베이스를 먼저 생성합니다.
CREATE DATABASE testDB DEFAULT CHARACTER SET utf8 collate utf8_general_ci;
testDB 라는 이름의 데이터베이스를 하나 생성하고 해당 데이터베이스의 기본 Charater-set을 UTF-8로 설정합니다. 이어서 사용자 계정도 하나 생성합니다. testid 라는 계정을 생성하고 비밀번호는 test01!로 생성하겠습니다.
CREATE USER 'testid'@'%' IDENTIFIED BY 'test01!';
이제 생성한 계정에 testDB의 개체들을 사용할 수 있는 권한을 부여합니다.
GRANT ALL PRIVILEGES ON testDB.* to 'testid'@'%';
다시 로그인해서 정상적으로 로그인이 되는지 확인합니다. 위에서 하신대로 [New Connection]을 하나 열고 로그인하시면 됩니다.
생성한 테이블에 데이터를 한 건 입력하고 SELECT 해서 테이블이 정상적으로 생성되었는지 확인합니다.
INSERT INTO TB_TEST VALUES (1, 'TEST');
SELECT *
FROM TB_TEST
Node.js 프로젝트 설정
위와 같이 데이터베이스에 대한 설정을 마쳤으면 이제 Node.js 에서 해당 데이터베이스를 사용하도록 설정합니다. 위의 포스트를 따라해서 "Hello World"까지 출력해 본 상태라면 현재 package.json은 express 모듈만 설치하여 아래와 같은 상태입니다.