2016-06-19 5 views
1

MySQL에서 table1에 4 개의 열 (날짜, 열기, 높음, 낮음, 닫음, 계산)이 있습니다. 새로운 값이 테이블 1에서 업데이트 될 때 계산 필드가 이전 행 값을 사용하여 업데이트되도록 트리거를 만드는 방법을 파악하려고합니다. 내가 현재 사용 계산 필드를 업데이트하기 위해 아래의 트리거를 사용하고 현재, 높은 현재 저와 가까운 지금MySQL 트리거의 이전 행 값에 액세스하십시오.

DELIMITER // 
create TRIGGER `updatetable1` before insert ON `table1` FOR EACH ROW begin 
    set NEW.Calculation=((NEW.High-New.Low)*0.118)+NEW.Close; 
    end // 
DELIMITER ; 

나는 다음과 같은 논리를 사용하여 공식을 조금 수정하고 싶은 현재 :

Calculation (i) =((High(i-1) -Low(i-1))*0.118)+Close(i-1); 

어떻게 액세스 할 수있는 이전 행 값의 고, 저와 클로스의 이 트리거를 업데이트하려면 현재 계산의 행 값을?

예 :

enter image description here

+0

'신'은 알고 있지만 '오래된'은 아는 것처럼 보입니다. 매뉴얼에서 : "트리거 본문 내에서 OLD 및 NEW 별명을 사용하여 주제 테이블 (트리거와 연관된 테이블)의 컬럼을 참조 할 수 있습니다. OLD.col_name은 갱신되기 전에 기존 행의 컬럼을 참조합니다 NEW.col_name은 삽입 될 새 행의 열 또는 업데이트 된 후 기존 행을 나타냅니다. " –

+0

@ ÁlvaroGonzález : 다음과 같이 논리를 작성했습니다. NEW.Calculation = ((OLD.High -OLD.Low) * 0.118) + OLD.Close; 오류 코드 : 1363. INSERT 트리거에 OLD 행이 없습니다. –

+0

죄송합니다. 질문을 잘못 읽었습니다. 나는 당신이 UPDATE 트리거를 쓰고 있다고 생각했습니다. –

답변

1

다음과 같이 트리거를 다시 작성할 수 있습니다 : 중 데이터 타입이

DELIMITER // 

create TRIGGER `updatetable1` before insert ON `table1` FOR EACH ROW 
begin 
    declare prev_low float; 
    declare prev_high float; 
    declare prev_close float; 

    select low, high, close 
    into  prev_low, prev_high, prev_close 
    from  table1 
    order by date desc 
    limit 1; 

    set NEW.Calculation=(prev_high-prev_low)*0.118 + prev_close; 
end// 

DELIMITER ; 

SQL fiddle

변경 prev_low (및 기타 변수)의 데이터 유형을 사용하는 너의 식탁에.

+0

다음과 같은 오류가 발생했습니다 : 삽입 전에 'updatetable1'을 (를) 삽입하기 전에'table1'을 작성하십시오. 각 행 시작을 선언하십시오. prev_low float \t 오류 코드 : 1064. SQL 구문에 오류가 있습니다. MySQL 서버 버전에 해당하는 설명서를 확인하여 올바른 구문을 찾으십시오. 'at line 3 근처에서 사용하십시오. –

+1

이것은 사용하는 분리 문자와 관련이 있습니다. 바이올린을 확인하십시오 : 당신은 그것을 볼 수 있습니다 (나는 구분 기호를'//'로 설정했습니다). – trincot

+0

명확한 설명을 위해 필자는 지금 막 내 대답에 트리거 전후의 구분 기호 수정 문을 추가했습니다. 당신이 이미 그걸 가지고 있었기 때문에, 나는 원래의 버전으로 그것들을 제공하지는 않았지만, 분명히 당신은 그것을 지키지 않았다. – trincot