2012-08-01 82 views
4

我試圖創建一個Trigger將通過一些IF ELSEIF語句運行,並檢查新值是NULL但是它只能到第一個IF語句。MySQL更新設置值

This Trigger is AFTER UPDATE。我的問題是,如果我只有SET一列值是什麼,其他SET到,他們是NULL或什麼。如果不是UPDATE命令中的SET,我如何測試此列。

示例更新:

UPDATE `stations_us`.`current_prices` SET `midPrice` = '3.59' WHERE `current_prices`.`_id` =1; 

有沒有在這個時候更新,但可以基於PHP腳本更新等欄目。

觸發:

BEGIN 
-- Definition start 
IF(NEW.regPrice IS NOT NULL) THEN 
INSERT INTO prices (stationID, price, type, 
prevPrice, prevDate, dateCreated, apiKey, uid) 
VALUES(NEW.stationID, NEW.regPrice, 'reg', OLD.regPrice, 
OLD.regDate, NEW.regDate, NEW.lastApiUsed, NEW.lastUpdatedBy); 

ELSEIF(NEW.midPrice IS NOT NULL) THEN 
INSERT INTO prices (stationID, price, type, 
prevPrice, prevDate, dateCreated, apiKey, uid) 
VALUES(NEW.stationID, NEW.midPrice, 'mid', OLD.midPrice, 
OLD.midDate, NEW.midDate, NEW.lastApiUsed, NEW.lastUpdatedBy); 

ELSEIF(NEW.prePrice IS NOT NULL) THEN 
INSERT INTO prices (stationID, price, type, 
prevPrice, prevDate, dateCreated, apiKey, uid) 
VALUES(NEW.stationID, NEW.prePrice, 'pre', OLD.prePrice, 
OLD.preDate, NEW.preDate, NEW.lastApiUsed, NEW.lastUpdatedBy); 
END IF; 
-- Definition end 
END 
+0

我不明白你的意思是什麼「如何測試這個列,如果它沒有設置這個更新命令。」你能解釋更多嗎? – octern 2012-08-01 16:34:36

回答

6

不能哪些列在SET子句中所引用的觸發器內告知。

您只能通過比較NEW.colOLD.col的值來檢查語句是否更改了col的值。

IF NOT (NEW.regPrice <=> OLD.regPrice) 

測試(NEW.col IS NOT NULL)不足以判斷值是否已更改。考慮舊值例如4.95並且新值爲NULL,它看起來好像您可能想要檢測該更改。


注意UPDATE語句可以超過一列的值:

UPDATE foo SET col1 = 'a', col2 = 'b', col3 = 'c' WHERE ... 

還要注意,一列可以被設置爲NULL,並且列可以設置爲現有值

UPDATE foo SET col1 = 'a', col2 = NULL, col3 = col3 WHERE ... 

在這種情況下,您的觸發器中,NEW.col2將評估爲NULL,並(NEW.col3 <=> OLD.col3)將評估爲1(TRUE),因爲舊的和新的價值是相等的。 (你的AFTER UPDATE觸發器實際上看到的是存儲的值,如果BEFORE INSERT觸發器已將該值刪除,併爲該列提供了不同的值,則該值不一定是來自UPDATE語句的值。 )

如果您的意圖是記錄數值的變化,您可能不想要ELSIF,而是想要遍歷所有列以檢查其值是否已更改。