MySql觸發器對同表更新


轉自https://blog.csdn.net/lihua5419/article/details/83622803

 

觸發器初始結構:

DELIMITER $$
CREATE
    TRIGGER `數據庫名`.`觸發器名` BEFORE/AFTER INSERT/UPDATE/DELETE
    ON `數據庫名`.`表名`
    FOR EACH ROW BEGIN
     -- 邏輯、條件語句
    END$$
 
DELIMITER ;

 


目的:當一張表中的某個字段值更新為特定值時,觸發更新本條數據的另一字段值

(示例:根據prj_base_info表中的project_status的值判斷是否是600時,觸發更新同表的complete_time字段的時間為系統當前時間)

1、開始寫出的觸發器如下所示

DROP TRIGGER IF EXISTS update_complete_time;
DELIMITER $
CREATE TRIGGER update_complete_time AFTER UPDATE 
ON prj_base_info FOR EACH ROW
BEGIN
    IF (new.project_status=600)
       THEN
    UPDATE prj_base_info 
    SET complete_time =DATE_FORMAT(NOW(), '%Y-%m-%d')
        WHERE prj_base_info.id = new.id;
 END IF;
END $

 


執行結果沒有問題,創建觸發器成功,但是執行update語句進行測試如下報錯,提示:無法更新存儲函數/觸發器中的表'prj_base_info',因為它已經被調用此存儲函數/觸發器的語句使用。

1 queries executed, 0 success, 1 errors, 0 warnings
 
查詢:update prj_base_info set type=2,project_status=600 where id='1537842899333'
 
錯誤代碼: 1442
Can't update table 'prj_base_info' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

 


Can't update table 'prj_base_info' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
通過查閱資料了解,同表的更新不能在觸發器里使用 update,而是直接使用set

修改為:

DROP TRIGGER IF EXISTS update_complete_time;
DELIMITER $
CREATE TRIGGER update_complete_time AFTER UPDATE 
ON prj_base_info FOR EACH ROW
BEGIN
    IF (new.project_status=600)
       THEN
    SET new.complete_time =DATE_FORMAT(NOW(), '%Y-%m-%d')
     ;
 END IF;
END $

 


結果發現還報錯。。。

錯誤代碼: 1362
Updating of NEW row is not allowed in after trigger

 


把AFTER修改為BEFORE即可:

DROP TRIGGER IF EXISTS update_complete_time;
DELIMITER $
CREATE TRIGGER update_complete_time BEFORE UPDATE 
ON prj_base_info FOR EACH ROW
 BEGIN
    IF (new.project_status=600)
     THEN
    SET new.complete_time =DATE_FORMAT(NOW(), '%Y-%m-%d')
    ;
 END IF;
END $

 


BEFORE與AFTER區別:
BEFORE:(insert、update)可以對new進行修改,AFTER不能對new進行修改,兩者都不能修改old數據。
對於INSERT語句, 只有NEW是合法的;
對於DELETE語句,只有OLD才合法;
對於UPDATE語句,NEW、OLD可以同時使用。

總結:BEFORE 或 AFTER 關鍵字決定何時執行觸發器動作,決定是在關聯行的插入、修改或刪除之前或者之后執行觸發器動作。

 

 

其他科參考:https://blog.csdn.net/rl529014/article/details/48293609

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM