mysql触发器与sql server触发器对比.

您所在的位置:网站首页 te的拼读 mysql触发器与sql server触发器对比.

mysql触发器与sql server触发器对比.

#mysql触发器与sql server触发器对比.| 来源: 网络整理| 查看: 265

文章目录 前言一、sql server触发器示例二、mysql触发器对应的示例

前言

本人呢,由于懒得下载sql server.本想用mysql一直代替学校老师教的sql server.一直用的风生水起,洋洋得意.直到那天…遇到了触发器!!!什么?这玩意这么恐怖?那是,这玩意让我用mysql花了3天…这里多谢@noisyfox 网友的指点.在这里我应该叫他前辈!

提示:以下是本篇文章正文内容,下面案例可供参考

题目要求:创建触发器要求在插入和更新学生年龄时检查age是否在15到60之间,如不在15到60,则弹出“年龄不合法”提示信息;

一、sql server触发器示例

sql server临时表

create trigger stu_insert -- 创建名称为stu_insert的trigger on stu -- trigger作用的table是stu for insert -- trigger在插入操作时生效 (标记x) as declare @age char(10) -- 声明@age变量 select @age=age from inserted --sql server触发器中会根据 x操作 生成一个对应临时表inserted 可以看作是stu的复制表.但有生命周期. if (@age60) begin -- if的语句体 print '年龄不合法' rollback TRANSACTION end else print '年龄合法插入成功' Drop trigger stu_insert; -- 摧毁该trigger commit; -- 备份插入操作. create trigger stu_delete on stu for delete as insert into stu1(sno,name,age,class) select sno,name,age,class from deleted if @@error!=0 begin print '备份失败' rollback end else print '备份成功'

在这里插入图片描述 在这里插入图片描述

二、mysql触发器对应的示例

关于mysql不支持显示或隐式的提交

mysql如何避免显示或隐式的提交

for each row解释

delimiter $$ -- 自定义结束符号 create trigger stu_insert -- 创建名称为stu_insert的trigger before insert -- trigger触发时机是insert操作提交数据之前 on stu -- trigger作用的table是stu for EACH ROW -- 行级触发器,mysql必须写 BEGIN -- 开始事物语句 # select age from stu where age=new.age into @age; --这条可忽略.有兴趣可验证.他相当于补救增添一个唯一约束. if (new.age 60) then # if-then-else-end if; 条件判断语句 -- mysql不支持显示或隐式的提交,因此不允许回滚.我们这个操作是抛出异常 并打印消息提示.抛出异常会自动回滚. SIGNAL SQLSTATE '02000' SET MESSAGE_TEXT = 'Warning: 年龄不合法!'; else select '年龄合法插入成功' into @str2; -- select 打印提示消息 语句必须放入容器中. end if; -- if条件结束的标志 end --事务结束的标志 $$ --自定义触发器结束 delimiter ; commit; -- 由于我设置了手动提交,因此需要这一句. Drop trigger stu_insert; -- 摧毁该trigger commit; -- 备份插入操作 create trigger stu_delete after delete on stu for EACH ROW BEGIN insert into stu1(sno, name, age, class) values(now(),now(),now(),now()); if @error != 0 then SIGNAL SQLSTATE '02000' SET MESSAGE_TEXT = 'Warning: 备份失败!'; else select '备份成功' into @str2; end if; end; commit;

在这里插入图片描述 在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

# 药品出库操作 delimiter $$ -- 自定义结束符号 create trigger recipel_update after insert on recipel for EACH ROW BEGIN SELECT @quantity=drug_quantity into @str FROM drugs WHERE NEW.drug_id = drugs.drug_id; IF @quantity @quantity THEN SIGNAL SQLSTATE '02000' SET MESSAGE_TEXT = 'Warning: 药品数量为零!'; ELSE UPDATE drugs SET drug_quantity = drug_quantity - NEW.count WHERE drug_id=NEW.drug_id AND is_delete=0; end if; end $$ -- 自定义触发器结束 delimiter ; drop trigger recipel_update; INSERT INTO recipel(DOCTOR_ID, COUNT, DRUG_ID, PATIENT_NAME) VALUES ('005', '2', '1000226', '病人6');

插入前 在这里插入图片描述 在这里插入图片描述 插入后 在这里插入图片描述 在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3