首页 > 其他分享 >15)触发器

15)触发器

时间:2023-05-31 21:35:42浏览次数:32  
标签:触发器 15 up update course trigger limit

1、触发事件:

触发器定义了一系列操作,称为触发程序,当触发事件发生时,触发程序会自动运行;格式如下:

create trigger 触发器名 触发时间 触发事件 on 表名 for each row
begin
    触发程序
end;

触发时间:before、after;

触发事件:insert、update、delete;

for each now:表示行级触发器;

 

 2、使用触发器实现检查约束:

使用触发器实现检查约束,确保课程的人数上限 up_limit 字段值在(60,150,230)范围内;

delimiter $$
create trigger insert_before_course_trigger before insert on course for each row
begin
    if new.up_limit not in(60,150,230) then
     signal sqlstate 'ERROR' set message_text = '选修人数上限只能在60、150、230之间取值'; #引发错误方式
    end if;
end;
$$
delimiter ;

new获取新值的标识符;old获取原值的标识符;使用格式:

new.字段 或 old.字段 

signal sqlstate 为引发错误的方式;

执行下列测试语句;

insert into course values(null,'音乐鉴赏',100,'暂无',default,'005');

 发现会报错;而且正是我们在signal那行所设定的 message_text 的值;原因在于我们设定的触发器就是让 up_limit 的值只能三选一;不能自定;

执行下列测试语句:

insert into course values(null,'音乐鉴赏',150,'暂无',default,'005');

 发现可以成功插入;

到此,我们执行update语句结果会怎么样呢?执行下列测试语句:我们更新course_no= 5 的up_limit的值:

update course set up_limit=100 where course_no = 5;

 发现成功update,这与我们设定的up_limit 的值不符合;那么我们如何修正呢?

那就是我们设定一个 update 的触发器;我们让其变更为原值;

delimiter $$
create trigger update_before_course_trigger before update on course for each row
begin
    if new.up_limit not in(60,150,230) then
     set new.up_limit = old.up_limit;
    end if;
end;
$$
delimiter ;

 那么我们将执行下列测试语句,修改为符合值;

update course set up_limit=150 where course_no = 5;

 可以发现我们可以修改为符合的值;再测试一下我们将其更新为不符合的值:

update course set up_limit=100 where course_no = 5;

 可以看到虽然我们匹配找到了一行,但是changed为0,就是未作update操作;

至此,我们的insert触发器和update触发器就完成了,维持 up_limit 的值只能在三选一;

我们可以再测试一下,当我们同时修改其他字段时:

update course set up_limit=100, status='已审核' where course_no = 5;

 可以发现,我们的up_limit 字段未作修改,但是status更新为已审核了,因为我们没有对该字段进行约束,符合预期;

 

3、查看和删除触发器:

#查看所有触发器
show triggers\G

#查看指定触发器名
show create trigger 触发器名\G
show create trigger insert_before_course_trigger\G

 貌似MySQL8.0版本之后不支持下列模糊查看了:

show trigger like '%trigger'\G

通过查询GPT,可以使用以下方法:

select * from information_schema.triggers where trigger_name like '%\_trigger'\G

查询information_schema下的triggers表,通过匹配名字进行模糊查找;

 

删除触发器命令:

#删除触发器
drop trigger 触发器;

 

标签:触发器,15,up,update,course,trigger,limit
From: https://www.cnblogs.com/xuan01/p/17446579.html

相关文章

  • yolotv5和resnet152模型预测
    我已经训练完成了yolov5检测和resnet152分类的模型,下面开始对一张图片进行检测分类。首先用yolo算法对猫和狗进行检测,然后将检测到的目标进行裁剪,然后用resnet152对裁剪的图片进行分类。首先我有以下这些训练好的模型 猫狗检测的,猫的分类,狗的分类 我的预测文件my_detect.p......
  • HDU1524(博弈--有向无环图SG函数)
    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1524题意:在一个有向无环图上有n个顶点,每一个顶点都只有一个棋子,有两个人,每次根据这个图只能将任意一颗棋子移动一步,如果到某一步玩家不能移动时,那么这个人就输.分析:本题是最典型的有向无环图的博弈,利用dfs把所有顶点的SG值......
  • POJ1151(线段树+扫描线求矩形面积并)
    题目:http://poj.org/problem?id=1151 #include<iostream>#include<string.h>#include<algorithm>#include<stdio.h>usingnamespacestd;constintN=10005;structnode{intl,r;intcov;doublelen;};structline{......
  • POJ1151(矩形切割入门题)
    题目:Atlantis 我的上一篇文章已经讲明了线段切割的思想,矩形切割就是把线段切割从一维推到二维就行了,思想都一样。#include<stdio.h>#include<string.h>constintN=205;typedefstruct{doublex1,y1;doublex2,y2;doublesum;}Node;NodeT[N];intn......
  • POJ2154(Pólya定理与欧拉函数优化)
    题目:Color 题意:将正n边形的n个顶点用n种颜色染色,问有多少种方案(答案modp,且可由旋转互相得到的算一种) 先说说Pólya定理设Q是n个对象的一个置换群,用m种颜色涂染这n个对象,一个对象涂任意一种颜色,则在Q作用下不等价的方案数为:   |Q|为置换群中置换的个数,为将置换q表示成不相杂......
  • BZOJ1503(Splay)
    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 #include<iostream>#include<string.h>#include<stdio.h>usingnamespacestd;structNode{intval,size,cnt,lazy;Node*pre,*ch[2];Node(){size=lazy......
  • python基础15
    递归函数什么是递归函数递归就是直接或者间接调用自己的函数就是递归函数1#练习题2l=[1,[2,[3,[4,[5,[6,[7,[8]]]]]]]34defindex(l):5foriinl:6iftype(i)isint:7print(i)8else:9index(i)算法之......
  • git 如何将GitHub仓库做服务器:015
    将Github的换成仓库来作为服务器使用: 1.创建(远程仓库)2.删除掉之前建立的链接查看已建立的链接:gitremote-v删除建立的链接:gigremoterm远程仓库名  3.重新建立刚刚创建的(远程仓库)链接:gitremoteaddtesthtmlhttps://github.com/he6868/he6868.github.io.g......
  • AD8315 ADI芯片 电子元器件中文版规格手册
    AD8315ADI芯片电子元器件中文版规格手册AD8315是ADI(AnalogDevicesInc.)公司生产的一款高性能、低噪声、宽动态范围的射频功率检测器。该芯片采用了ADI公司的高性能射频检测技术,能够实现高精度的功率检测和测量功能。AD8315的主要特点如下:宽动态范围:具有70dB的动态范围,能够满足......
  • AD8315ARM ADI芯片 电子元器件中文版规格手册
    AD8315ARM是ADI(AnalogDevicesInc.)公司生产的一款高性能、低噪声、宽动态范围的射频功率检测器。该芯片采用了ADI公司的高性能射频检测技术,能够实现高精度的功率检测和测量功能。AD8315ARM的主要特点如下:宽动态范围:具有70dB的动态范围,能够满足各种功率检测和测量的需求。高精度......