一、介绍
触发器是与表有关的数据库对象,指在insert/update/delete之前或之后,触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作。
使用别名OLD和NEW来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器还只支持行级触发(比如说 一条语句影响了 5 行 则会被触发 5 次),不支持语句级触发(比如说 一条语句影响了 5 行 则会被触发 1 次)。
触发器类型 | NEW 和 OLD |
---|---|
INSERT | NEW 表示将要或者已经新增的数据 |
UPDATE | OLD表示修改之前的数据,NEW表示将要或已经修改后的数据 |
DELETE | OLD表示将要或者已经删除的数据 |
二、触发器-语法
创建
CREATE TRIGGER trigger_name
BEFORE/AFTER INSERT/UPDATE/DELETEON
tbl_name FOR EACH ROW --行级触发器BEGIN
BEGIN
trigger_stmt ;
END;
查看
SHOW TRIGGERS ;
删除
DROP TRIGGER [schema_name]trigger_name; --如果没有指定schema_name,默认为当前数据库。
三、触发器-案例1(insert类型)
--插入数据触发器如下:
create trigger tb_user_insert_trigger
after insert on tb_user for each rowbegin
insert into user_logs(id, operation,operate_time,operate_id,operate_params)VALUES(null, 'insert ', now(),new.id, concat( '插入的数据内容为: id=' , new.id , ' , name=' ,new.name) );
end;
--查看触发器
SHOW TRIGGERS ;
--删除触发器
DROP TRIGGER tb_user_insert_trigger
四、触发器-案例2(update类型)
--更新数据触发器如下:
create trigger tb_user_update_trigger
after update on tb_user for each rowbegin
insert into user_logs(id, operation,operate_time,operate_id,operate_params)VALUES(null, 'update ', now(),new.id, concat('更新前的数据: id=' , old.id , ' , name=' ,old.name,'更新后的数据: id=' , new.id , ' , name=' ,new.name) );
end;
--查看触发器
SHOW TRIGGERS ;
--删除触发器
DROP TRIGGER tb_user_update_trigger
五、触发器-案例3(delete类型)
--删除数据触发器如下:
create trigger tb_user_delete_trigger
after deleteon tb_user for each rowbegin
insert into user_logs(id, operation,operate_time,operate_id,operate_params)VALUES(null, 'delete', now(),old.id, concat('删除前的数据: id=' , old.id , ' , name=' ,old.name) );
end;
--查看触发器
SHOW TRIGGERS ;
--删除触发器
DROP TRIGGER tb_user_delete_trigger
六、触发器总结
MySQL触发器是在特定表上执行的存储过程,通常在插入、更新和删除数据时触发。触发器允许您在数据库操作前后执行自定义逻辑,例如验证数据的有效性、记录日志或更新其他相关表的数据。
创建MySQL触发器:
CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON table_name
FOR EACH ROW
BEGIN-- 触发器逻辑
END;
触发器名称:您为触发器指定的唯一名称。
BEFORE / AFTER:指定触发器在操作之前或之后触发。
INSERT / UPDATE / DELETE:指定触发器在执行插入、更新或删除操作时触发。
table_name:触发器所属的表名。
FOR EACH ROW:表示触发器将为每个受影响的行执行一次。
在BEGIN和END之间编写触发器的逻辑。可以使用NEW关键字引用插入或更新的新值,使用OLD关键字引用更新或删除的旧值。
例如,以下示例是一个简单的触发器案例:
在每次插入新行到"orders"表时,自动更新"last_update"列为当前时间:
CREATE TRIGGER update_last_update
AFTER INSERT ON orders
FOR EACH ROW
BEGINUPDATE ordersSET last_update = NOW()WHERE id = NEW.id;
END;
这只是一个简单的示例,实际上可以编写更复杂的触发器逻辑来满足您的需求。