2012-09-12 54 views
0

當我在db中插入數據時,我必須將當前記錄與前一記錄進行比較。如果需要,當前記錄的某些值需要修改。MySQL觸發器:在插入前比較記錄與先前記錄

我試過一些像下面這樣的SQL塊,但都給出了SQL錯誤。這一個給我一個錯誤說,我選擇了超過1條記錄。

DELIMITER $$ 
CREATE 
    TRIGGER set_moment_display 
    BEFORE INSERT ON data 
    FOR EACH ROW 

    BEGIN 
     DECLARE moment DATETIME; 

     SELECT press_moment_1 INTO moment FROM data LIMIT 1; 

     IF moment > NEW.press_moment_1 THEN SET NEW.press_moment_1 = moment; 
     END IF; 
    END$$ 
DELIMITER ; 

我該如何實現我上面描述的。

回答

0

您可以使用別名「OLD」。

You can refer to columns in the subject table 
(the table associated with the trigger) by using the aliases OLD and NEW. 
OLD.col_name refers to a column of an existing row before 
it is updated or deleted. NEW.col_name refers to the column 
of a new row to be inserted or an existing row after it is updated 

UPDATE

吉姆·加里森正確指出了我的錯誤, 「BEFORE INSERT」 沒有 「老」。值,這個別名只適用於UPDATE和DELETE。

+0

這不僅適用於更新觸發器嗎?插入沒有舊的價值。 –

+0

Ooopss ...對不起,錯了!我現在已經意識到「插入前」 –

0

這裏的問題是,由於SQL數據庫沒有行排序的隱含概念(您在每個查詢中提供了排序標準),因此觸發器沒有「上一行」查看。 「以前插入的行」在插入觸發器的上下文中沒有意義。

假設它有一段時間,並且有多個進程在表中插入行。當觸發器觸發進程#1的插入時,哪一行是「上一個」行?先前由進程#1插入的那個?假設按時間順序排列的「最新」行實際上是由進程#3插入的?

如果您需要這樣做,除非您可以使用已知鍵值來標識您理解爲「最近期」的行,否則無法在觸發器中完成此操作。否則,它必須在執行插入操作的應用程序中處理。

相關問題