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)
    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.

通过查阅资料了解,同表的更新不能在触发器里使用 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)
    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)
    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 关键字决定何时执行触发器动作,决定是在关联行的插入、修改或删除之前或者之后执行触发器动作。

微信扫描下方二维码(新开通的个人微信公众号)  更多优质资源及面试文章及时获取 请大家多多支持哦

触发器初始结构:DELIMITER $$CREATE TRIGGER `数据库名`.`触发器名` BEFORE/AFTER INSERT/UPDATE/DELETE ON `数据库名`.`表名` FOR EACH ROW BEGIN -- 逻辑、条件语句 END$$DELIMITER ;目的:当一张表中的某个字段值更新为特定值时,触发更新本... 部分数据库管理系统可以针对数据定义语言(DDL)使用 触发器 ,称为DDL 触发器 触发器 可通过数据库中的相关 实现级联更改,不过,通过级联引用完整性约束可以更有效地执行这些更改。 触发器 可以强制用比CHECK约束定义的约束更为复杂的约束。与 CHECK 约束不同, 触发器 可以引用其它 中的列。例如, 触发器 可以使用另一个 中的 SELECT 比较插入或 更新 的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。 触发器 也可以评估数据修改前后的 状态,并根据其差异采取对策。一个 中的多个同类 触发器 (INSERT、UPDATE 或 DELETE)允许采取多个不同的对策以响应同一个修改语句。 CREATE 语句,如:CREATE DATABASE、CREATE TABLE、CREATE INDEX 等。 ALTER 语句,如:ALTER DATABASE、ALTER TABLE、ALTER INDEX 等。 DROP 语句,如:DROP DATABASE、DROP TABLE、DROP IN
本文实例讲述了 mysql 触发器 创建与使用方法。分享给大家供大家参考,具体如下: 什么是 触发器 触发器 用来在某些操作之后/之前,“自动”执行一些操作。(比如插入了新的学生信息,那么在班级 中应该修改学生数)。 当insert delete update设置 触发器 之后,执行insert delete update操作就会自动触发设置的内容。 一张 最大能有6个 触发器 (3*2,三种操作*两种时间(before|after))。 创建 触发器 create trigger 触发器 名 before|after 事件 on 名 for each row 触发器 语句; 更新 一张 ,必须是before,如果是after,会引起死锁. 貌似需要加自治事务,PRAGMA AUTONOMOUS_TRANSACTION. 不用update 更新 语句,用:new.字段名赋值即可. create or replace trigger mdt_server_update_tri before insert or update on mdt_server_info_tracking_t for each row declare PRAGMA AUTONOMOUS_TRANSA
最近做的项目需要实现基础数据 有数据插入的时候统计数据 能自动 更新 ,要实现此需求目前有两种方案。方案一是通过Job定时执行,计算基础数据 中的数据,然后 更新 统计 ;方案二采用 触发器 ,因为已知基础数据 只会有数据插入操作,不会 更新 ,可以建立插入 触发器 。比较两种方案,考虑到系统访问的实时性比较高,因此决定采用方案二。 基础 [dbo].[table1]  的建 语句 CREATE TABLE [...
id int unsigned not null auto_increment primary key, cid int not null, name varchar(10) not null )enigne=InnoDB insert into tb values(null,0,'xyg'),(null,0,'china'); select * fr