mysql触发器对同一张表做操作_MySql 触发器对同表操作
觸發(fā)器初始結(jié)構(gòu):
DELIMITER $$
CREATE
TRIGGER `數(shù)據(jù)庫名`.`觸發(fā)器名` BEFORE/AFTER INSERT/UPDATE/DELETE
ON `數(shù)據(jù)庫名`.`表名`
FOR EACH ROW BEGIN
-- 邏輯、條件語句
END$$
DELIMITER ;
目的:當(dāng)一張表中的某個(gè)字段值更新為特定值時(shí),觸發(fā)更新本條數(shù)據(jù)的另一字段值
( 示例:根據(jù) prj_base_info 表中的 project_status 的值判斷是否是600時(shí),觸發(fā)更新同表的 complete_time 字段的時(shí)間為系統(tǒng)當(dāng)前時(shí)間 )
開始寫出的觸發(fā)器如下所示
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 $
執(zhí)行結(jié)果沒有問題,創(chuàng)建觸發(fā)器成功,但是執(zhí)行 update 語句進(jìn)行測試如下報(bào)錯(cuò),提示:無法更新存儲函數(shù)/觸發(fā)器中的表 'prj_base_info',因?yàn)樗呀?jīng)被調(diào)用此存儲函數(shù)/觸發(fā)器的語句使用。
1 queries executed, 0 success, 1 errors, 0 warnings
查詢:update prj_base_info set type=2,project_status=600 where id='1537842899333'
錯(cuò)誤代碼: 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.
通過查閱資料了解,同表的更新不能在觸發(fā)器里使用 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 $
結(jié)果發(fā)現(xiàn)還報(bào)錯(cuò)。。。
錯(cuò)誤代碼: 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 區(qū)別:
BEFORE:( insert、update )可以對 new 進(jìn)行修改,AFTER 不能對 new 進(jìn)行修改,兩者都不能修改 old 數(shù)據(jù)。
對于 INSERT 語句, 只有 NEW 是合法的;
對于 DELETE 語句,只有 OLD 才合法;
對于 UPDATE 語句,NEW、OLD 可以同時(shí)使用。
總結(jié):BEFORE 或 AFTER 關(guān)鍵字決定何時(shí)執(zhí)行觸發(fā)器動作,決定是在關(guān)聯(lián)行的插入、修改或刪除之前或者之后執(zhí)行觸發(fā)器動作。
總結(jié)
以上是生活随笔為你收集整理的mysql触发器对同一张表做操作_MySql 触发器对同表操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: for循环只执行一次_Python中fo
- 下一篇: oracle 截取中英文混合_C语言截取