2013-01-22 1 views
2

나는 MySQL 테이블에 트리거를 가지고 있습니다. 표에는 약 20 개의 열이 있습니다.하나의 열 대신에 모든 업데이트에서 트리거 실행

DELIMITER $$ 
CREATE 
DEFINER=`root`@`localhost` 
TRIGGER `completion_date_update` 
BEFORE UPDATE ON `orders` 
FOR EACH ROW 
BEGIN 
    IF NEW.`order_status` = 'COMPLETED' THEN 
    SET NEW.`completion_date` = NOW(); 
    END IF; 

    IF NEW.`order_status` != 'COMPLETED' THEN 
    SET NEW.`completion_date` = NULL; 
    END IF; 
END$$ 

는 내가 원하는이 트리거가 completion_dateorder_status 업데이트됩니다 업데이트하는 것입니다. 다른 열이 업데이트되면이 트리거는 아무 것도해서는 안됩니다.
실제로이 트 리거는 열 업데이트시 completion_date을 업데이트합니다.

누구나 내게 설명 할 수 있습니까? 왜 이런 일이 일어나고 무엇이 잘못 되었습니까?

order_status 열은 NULL NOT이며, 다음과 같이 사용할 수있는 값이 있습니다

enum('NEW','OPEN','COMPLETED','CANCELLED','REPLACED') 

기본이 'NEW'

감사

+0

은 'order_status'가 nullable입니까? 열의 값이 이미 'completed'로 표시되어 있고 다른 열에 만 upting하면 트리거가 실행됩니까? –

+0

5 가지 옵션이있는 ENUM입니다. 난 그냥 NULL로 설정합니다. 나는 지금 그것을 시험 할 것이다. – 6bytes

+0

@JW. 나는'order_status' 컬럼 세부 사항으로 나의 질문을 업데이트했다. – 6bytes

답변

1

order_status가 변경된 경우 당신은 또한 비교해야하고 새 값입니다 COMPLETED

IF (NEW.order_status <> OLD.order_status) AND (NEW.order_status = 'COMPLETED') THEN 
    SET NEW.completion_date = NOW(); 
END IF; 

이고 아래 다른 IF을 제거 할 수 있습니다.

+1

그래, 그게 내가 해냈어. :) – 6bytes

관련 문제