2014-11-22 4 views
0

내가 MySQL 데이터베이스에 두 개의 테이블이 인식하지 : "stock_pricing"와 "DATA_IMPORT을"MySQL의 트리거 INSERT ... 중복 키 UPDATE 열

첫 번째 테이블의

열 : 초에 STOCK_ID, DATE, LAST_CLOSE_DOM_CURR 열 테이블 : STOCK_ID, DATE, ADJ_CLOSE

첫 번째 테이블에는 stock_id와 date의 인덱스가 함께 있습니다. 이것들은 UNIQUE로 정의되었습니다. 두 번째 테이블에 인덱스가 전혀 없습니다.

두 번째 테이블에는 들어오는 데이터가 있습니다. 이 테이블에는 들어오는 데이터를 첫 번째 테이블에 삽입하는 BEFORE INSERT 트리거가 있습니다.

삽입 트리거에서 STOCK_ID와 DATE의 조합이 첫 번째 테이블의 UNIQUE 인덱스를 위반하면 트리거의 ON DUPLICATE KEY UPDATE 부분이 실행됩니다.

내가 생각할 수있는 모든 조합을 시도했지만 트리거가 내 열 이름을 인식하지 못합니다. 많은 감사합니다. 당신은 테이블을 참조하는

BEGIN 
INSERT INTO stock_pricing (`STOCK_ID`, `DATE`, `LAST_CLOSE_DOM_CURR`) 
VALUES (DATA_IMPORT.STOCK_ID, DATA_IMPORT.DATE, DATA_IMPORT.ADJ_CLOSE) 
ON DUPLICATE KEY UPDATE 
stock_pricing.STOCK_ID= DATA_IMPORT.STOCK_ID, stock_pricing.DATE= DATA_IMPORT.DATE, stock_pricing.LAST_CLOSE_DOM_CURR= DATA_IMPORT.ADJ_CLOSE; 
END 

답변

0

없이 from 절을 data_import을했다. 이것은 insert . . . select를 사용하여 고정 :

INSERT INTO stock_pricing (`STOCK_ID`, `DATE`, `LAST_CLOSE_DOM_CURR`) 
    SELECT DATA_IMPORT.STOCK_ID, DATA_IMPORT.DATE, DATA_IMPORT.ADJ_CLOSE 
    FROM DATA_IMPORT 
    ON DUPLICATE KEY UPDATE 
    stock_pricing.STOCK_ID= DATA_IMPORT.STOCK_ID, stock_pricing.DATE= DATA_IMPORT.DATE, stock_pricing.LAST_CLOSE_DOM_CURR= DATA_IMPORT.ADJ_CLOSE; 

이러한 쿼리를 작성하는 전형적인 방법은 다음과 같습니다 ON DUPLICATE KEY UPDATE를 들어

INSERT INTO stock_pricing (`STOCK_ID`, `DATE`, `LAST_CLOSE_DOM_CURR`) 
    SELECT di.STOCK_ID, di.DATE, di.ADJ_CLOSE 
    FROM DATA_IMPORT di 
    ON DUPLICATE KEY UPDATE STOCK_ID = VALUES(STOCK_ID), 
          DATE = VALUES(DATE), 
          LAST_CLOSE_DOM_CURR = VALUES(LAST_CLOSE_DOM_CURR); 

이 작동하려면, 당신은 고유 인덱스 또는 기본 키가 필요합니다. 나는 당신이 이것을 가지고 있다고 가정합니다.

마지막으로이 코드는 NEW 또는 OLD에 대한 참조가 없으므로 트리거에 약간 이상하게 보입니다. 여전히 트리거에 문제가있는 경우 번에 번 질문을하고 트리거의 전체 코드를 포함 시키십시오.

+0

고든에게 감사드립니다. 네 고유 키가 있습니다. 내 게시 된 코드는 전체 코드이며 Mqsql 참조 설명서에서 필자의 의견을 받았습니다. 난 당신의 코드를 시도했지만 불행히도 여전히 동일한 응답을 얻을 : SQL 오류 (1054) 알 수없는 열 'ADJ_CLOSE'필드 목록에서 '. – Mark

+0

@ user3237164 . . 그것은 새로운 테이블에있는 컬럼의 이름 인'VALUES (LAST_CLOSE_DOM_CURR)'이어야한다. –

+0

DATA_IMPORT.ADJ_CLOSE 값을 stock_pricing.LAST_CLOSE_DOM_CURR에 입력하면 LAST_CLOSE_DOM_CURR = VALUES (LAST_CLOSE_DOM_CURR)을 (를) 어떻게 사용할 수 있습니까? 왜 그렇게되지 않을까요? LAST_CLOSE_DOM_CURR = VALUES (di.ADJ_CLOSE) ?? 부수적으로 작동하지 않는 것도 있습니다. 나는 매우 혼란 스럽다. 트리거의 중복 부분을 실행하는 시점에 di.ADJ_CLOSE 값이 LAST_CLOSE_DOM_CURR 값으로 전달 되었기 때문입니까? – Mark

관련 문제