自学内容网 自学内容网

mysql的触发器

触发器介绍
  • 触发器是一种特殊的存储过程,和存储过程一样是一个能够完成特定功能、存储在数据库服务器上的SQL代码,只是触发器无需调用,当对数据库表中的数据执行DML操作时自动触发这个SQL代码的执行,无需手动调用
  • 在mysql中,只有执行insert、delete、update操作时才能触发触发器
  • 触发器的这种特性可以协作应用在数据库端确保数据的完整性,日志记录、数据校验等操作
  • 使用别名old和new来引用触发器中发送变化的记录内容,这与其他数据库类似,现在触发器还只能支持行级触发,不支持语句触发
2、触发器的特点
  • 触发的条件:insert、delete、update
  • 触发时机:在增删改之前或之后
  • 触发频率:针对每一行
  • 触发器定义在表中or附着在表上,一般是附着在表上,即定义完表之后再定义触发器
3、创建触发器

3.1 创建只有一个执行语句的触发器

create trigger trigge_name before|after 触发事件
on table_name for each row
执行语句;

3.2 创建有多个执行语句的触发器

create trigger trigger_name before|after 触发事件
on table_name for each row
begin
执行语句列表
end;

3.3 示例:

  • 当用户表中有增删改的操作时,日志表能自动记录

    – 数据准备

    create database demo_trigger;
    use demo_trigger;
    
    create table user(
    user_id int primary key,
    user_name varchar(16) not null,
    password varchar(16) not null
    )charset = utf8;
    
    create table user_logs(
    id int primary key auto_increment,
    time timestamp,
    lob_text varchar(255)
    )charset = utf8;
    

    – 当用户表增加用户时,日志表自动记录

    drop trigger if exists trigger01;
    
    create trigger trigger01 after insert
    on user for each row
    insert into user_logs values(null, now(), 'user表中添加了新用户');
    
    --往user表中添加数据触发触发器
    insert into user values(1, 'jack', '123456');
    

    –当用户表中数据被修改时,日志表自动记录

    drop trigger if exists trigger02;
    
    create trigger trigger02 before update
    on user for each row
    insert into user_logs values(null, now(), 'user表中有数据被修改');
    
    update user set password = '654321' where user_id = 1;
    
5、触发器的new和old关键字

5.1 mysql中定义了new和old用来表示触发器所在的表中,触发了触发器的那一行数据,触发器不断能记录有变化,还能记录具体的变化

触发器类型new和old的使用
insert型触发器new表示将要(before)或者已经(after)新增的数据
update型触发器old表示修改之前的数据,new表示将要或已经修改的数据
delete型触发器old表示将要或已经删除的数据

5.2 insert类型触发器

drop trigger if exists trigger03;

create trigger trigger03 after insert
on user for each row
insert into user_logs values(null, now(), concat_ws(',', '添加了新用户,信息为:', new.user_id, new.user_name, new.password));

insert into user values(2, 'mike', '123456');

5.3 update类型触发器

drop trigger if exists trigger04;

create trigger trigger04 after update
on user for each row
insert into user_logs values(null, now(), concat_ws(',', '用户信息被修改', '修改前的user_id:', old.user_id, '修改前的user_name;', old.user_name, '修改前的password:', old.password, '修改后的user_id:', new.user_id, '修改后的user_name;', new.user_name, '修改后的password:', new.password));

update user set password = '111111' where user_name = 'mike';

5.4 delete类型触发器

drop trigger if exists trigger05;

create trigger trigger05 after delete
on user for each row
insert into user_logs values(null, now(), concat('用户', old.suer_name, '的信息被删除'));

delete from user where user_name = 'jack';
6、查看和删除触发器
--查看触发器
show triggers;

--删除触发器
drop trigger if exists trigger_name;
7、触发器注意事项
  • 触发器不能对本表进行insert、update、delete操作,以免递归循环触发
  • 触发器针对每一行的执行,应尽量减少触发器,避免降低效率,对增删改频繁的表切记不要使用触发器,它会非常消耗资源

原文地址:https://blog.csdn.net/CNDS7869/article/details/143456889

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!