MySQL_触发器Trigger _笔记

触发器是一个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。

换种个人理解的方法就是,当一张表做了插入,更新,删除等动作时,就会通过设定好的触发器触发从而联动另一张表,自动进行相应的操作。

查看触发器

SHOW TRIGGERS \G                                                               查询所有触发器的信息,不能查询指定的触发器

SELECT * FROM information_schema.triggers \G               查询tiggers中的信息,会显示所有触发器的详细信息

SELECT * FROM information_schema.triggers WHERE TRIGGER_NAME='t1_triggers' \G 

只查询t1_triggers触发器的详细信息。

删除触发器

DROP  TRIGGER  触发器名 | 数据库名.触发器名;

创建触发器语法

DELIMITER $

create trigger Trigger_name <before | after | instead of> <insert | update | delete>

on table_name

for each row

BEGIN

--触发器代码

END $

DELIMITER ;

DELIMITER是mysql中的修改命令结束符,默认情况下MySQL的命令是以分号(;)结束的,所以开始将结束符改为($),END后才结束这段创建触发器操作,最后再将结束符改为(;)。可以缩写为(\d)。

Trigger_name是触发器的名称,触发器名称在当前数据库中必须是唯一的。

<before | after | instead of>是触发时间,before和after 用于表示触发器是在激活它的语句之前或者之后触发,通常使用after,如果希望验证新数据是否满足使用限制,则使用 before。instead of触发器用在对视图的更新上。

table_name为关联表名

[FOR EACH ROW]为可选项,如果注明了FOR EACH ROW,则说明了该触发器是一个行级的触发器,DML语句处理每条记录都会执行触发器;

触发器代码中NEW和OLD的使用:

对于INSERT语句, 只有NEW是合法的;

对于DELETE语句,只有OLD才合法;

对于UPDATE语句,NEW、OLD可以同时使用;

删除和更新后面的条件必须为主键。

做个简单的测试:

先创建两张表

create table t1(

id int primary key AUTO_INCREMENT not null,

name varchar(20),

sex enum('m','f'),

salary double(10,2)

);

create table t2(

total int,

t_salary double(15,2)

);

现在这两张表是没有关联的,创建一个触发器

\d $

create trigger t1_insert

after insert on t1

for each row

BEGIN

update t2 set total=total+1,t_salary=t_salary+new.salary;

END$

\d ;

insert into t2(total,t_salary) values(0,0);

给t2表一个初始值用来算数,然后向t1表插入一条数据,可以看到t2表自动进行了触发器的操作

insert into t1(name,sex,salary) values('aoteman','m',10000);

insert into t1(name,sex,salary) values('shejing','f',20000),('huluwa','m',30000);

再试一下

想了半天,不知道更新和删除的触发器该咋写,试着用统计函数来计算表2,但是创建触发器后无法再更新表1,提示组函数的使用无效

继续学习去了..

发布了60 篇原创文章 · 获赞 9 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_44697035/article/details/104365351