认识MySQL触发器

简述触发器

MySQL触发器可以理解为是一个监听器或一个事件,一旦表中的数据有变化,就会触发一个事件,执行该事件内的逻辑代码。

  1. 可以激活触发器的操作:INSERT、UPDATE、DELETE(查询操作不会激活触发器)
  2. 可以设置激活触发器的时刻:before(在操作执行之前激活)、after(在操作执行之后激活)

创建或删除触发器

# 创建
create trigger trigger_name before/after insert/update/delete on table_name for each row sql语句

例如:
# 每次在test表插入数据前 都往test2表内插入一条数据(名字:小明,性别:男,年龄:18)
create trigger test_trigger before insert on test for each row insert into test2 values(null, '小明', '男', 18);

# 删除
drop trigger trigger_name

图解创建语句

image

NEW与OLD的使用

NEW.col_name是获取当前触发器要操作的表内列的新值,比如insert会往表的列中插入新值,update会更新新值到表的列中。这些新值都是可以在触发器中使用的,但是得加上NEW标明要使用这个值。

OLD.col_name同理,触发器操作列中的旧值。

  1. INSERT操作只能使用NEW,不能使用OLD。
  2. UPDATE操作在before情况下能使用NEW和OLD,在after情况下只能使用NEW。
  3. DELETE操作只能使用OLD,不能使用NEW。

建立测试表

# 学生表
create table student(
	id int auto_increment,
	name varchar(5),
	age int,
	grade_id int,
	primary key (id)
);

# 年级表
create table grade(
	grade_id int,
	count int
);

INSERT

如果插入的学生的年龄小于18 则年龄为18

create trigger student_insert_trigger
before/after insert on student
for each row
SET NEW.age = IF(NEW.age < 18, 18, NEW.age);

UPDATE

如果在更新前 新年龄小于18,则使用旧年龄更新进去(值不变),否则使用新年龄更新进去。

create trigger student_update_before_trigger
before update on student
for each row
SET NEW.age = IF(NEW.age < 18, OLD.age, NEW.age);

如果在更新后 新年龄大于100,则新年龄强制等于100。

create trigger student_update_after_trigger
before update on student
for each row
SET NEW.age = IF(NEW.age > 100, 100, NEW.age);

DELETE

删除一个学生,学生对应的班级人数减一。

create trigger student_delete_trigger
before delete on student
for each row
update grade set count = count - 1 where grade_id = old.grade_id

BEGIN…END结构

  1. 在begin…end语法结构中,触发器可以执行多条SQL语句,还可以在里面执行条件判断、循环操作。(上面的操作仅支持执行一条SQL语句。)
  2. begin…end要配合着delimiter //分隔符来进行使用,相当于规定好开始和结束的位置。

例子

定义一个触发器:当新插入的学生的年龄小于18,则年龄等于18;如果大于100,则年龄等于100;

# 执行此语句表示开始定义BEGIN...END结构
mysql> delimiter //

mysql> create trigger student_trigger
before insert on student
for each row
BEGIN
	IF NEW.age < 18 THEN
		SET NEW.age = 18;
	ELSEIF NEW.age > 100 THEN
		SET NEW.age = 100;
	END IF;
END;//

# 执行此语句表示定义BEGIN...END结构完成
mysql> delimiter ;

博主的博客网站:https://www.lollycode.com
觉得不错,点个赞再走呗!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rococy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值