2013-01-22 36 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_date只有當列order_status被更新。如果任何其他列被更新,則此觸發器不應該執行任何操作。
實際發生的情況是此觸發器在更新任何列時正在更新completion_date

任何人都可以向我解釋爲什麼會發生這種情況,我做錯了什麼?

order_status列是NOT NULL和下面都有可能值:

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

默認爲'NEW'

感謝

+0

是'order_status'可爲空?如果列的值已經標記爲「已完成」並且您只在另一列上升,觸發器會觸發? –

+0

這是一個有五種不同選項的ENUM。我只是將它設置爲NOT 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

相關問題