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