广告
返回顶部
首页 > 资讯 > 数据库 >触发器和存储过程
  • 600
分享到

触发器和存储过程

2024-04-02 19:04:59 600人浏览 安东尼
摘要

触发器和存储过程   1.触发器   在进行dml操作的时候(insert,update,delete),可以对事件进行监听和响应,这种机制在数据库中叫做触发器。  

触发器和存储过程
  1.触发器
  在进行dml操作的时候(insert,update,delete),可以对事件进行监听和响应,这种机制在数据库中叫做触发器。
  触发器与永久性表关联,只能建在永久性表上面,不能是temporary表或view,且只有insert,update,delete三种事件。
  Mysql -u root -paixocm
  show triggers;
  show triggers\G;
mysql> delimiter //

====改结束符
 
自动在内存中生成临时的new表和old表,触发器执行完成后自动销毁
insert 操作进来的数据放在new表中
delete操作删除的数据放在old表中
update操作跟新前的数据放在old表中,更新后的数据放在new表中
old表是只读的,而new表在触发器程序中可以重新赋值

触发器的触发时机:
before:在执行操作之前要运行的语句
after:在执行操作之后要运行的语句

例:创建一个触发器,当输入的学生成绩小于0时设置为0,当大于100时设置为100

  mysql> create trigger tr_stu_bf
   -> before insert on stu
   -> for each row
   -> begin
   -> if new.score < 0 then
   -> set new.score=0;
   -> elseif new.score > 100 then
   -> set new.score=100;
   -> end if;
   -> end
   -> //

 例:当学生的score大于等于90时,将学生的id和名字写入yxstu表中;
 mysql> create trigger tr_ins_af
   -> after insert on stu
   -> for each row
   -> begin
   -> if new.score >= 90 then
   -> insert into yxstu values(new.id,new.name);
   -> end if;
   -> end
   -> //
    练习:新建销售表sales,包含商品id,商品名,商品类型(代号),销售数量四个字段;新建库存表store,包含商品id,
     商品名,库存数量四个字段,要求在库存表中加入4条数据,库存量都为100;然后每销售一件商品则相应商品的
     库存量就减少商品的销售量;当删除销售表里的记录时则将库存表相应的记录也删除
     库存表
     1  华为手机  p001  100
     2  小米手机  p002  100
     3  中兴手机  p003  100
     4  vivi手机  p004  100

after delete on sales
  for each row
  begin
  delete from store where store_number=old.sales_number
  end
  //
 
 
  练习:创建学生成绩表score,包括记录ID,学生编号(s001),学生姓名,数学、语文、英语三门课程的成绩;新建学生
      情况表scond,包含包括记录ID,学生编号(s001),学生姓名,学生表现四个字段,每插入一条成绩表记录时,
      则在学生情况表里插入相应的信息,如果学生三门课的平均成绩大于等于90分,则学生表现字段为"优秀",如
      果三门课的平均成绩为>=70并<90则为良好,大于等于60小于70为及格,小于60为不及格。
      mysql> create table score(id int primary key,sno varchar(6),sname varchar(20),math float(4,1),chinese float(4,1),english float(4,1));
   
 mysql> create table scond(id int primary key,sno varchar(6),sname varchar(20),perfORM varchar(10));
      mysql> create trigger tr_sc_ins_af
   -> after insert on score
   -> for each row
   -> begin
   -> declare ascore float(4,1);
   -> set ascore=(select (new.math+new.chinese+new.english)/3 from score limit 1);
   -> if ascore >= 90 then
   -> insert into scond values(new.id,new.sno,new.sname,'优秀');
   -> elseif ascore>=70 && ascore < 90 then
   -> insert into scond values(new.id,new.sno,new.sname,'良好');
   -> elseif ascore>=60 && ascore < 70 then
   -> insert into scond values(new.id,new.sno,new.sname,'及格');
   -> elseif ascore<60 then
   -> insert into scond values(new.id,new.sno,new.sname,'不合格');
   -> end if;
   -> end
   -> //

 练习:如果在score表中删除学生记录,则将scond表中相应的学生记录也一起删除。
 
  after delete on score
  for each row
  begin
  delete from store where id=old.id
  end
  //
 
 练习:当更新score表中数学、语文和英语成绩时,检查是否合理,如果低于0分则为0,高于100分则为100。
   
  mysql> create trigger haha
   -> before update on score
   -> for each row
   -> begin
   -> if new.chinese < 0 then
   -> set new.chinese=0;
   -> elseif new.chinese > 100 then
   -> set new.chinese=100;
   
   -> elseif new.math < 0 then
   -> set new.math=0;
   
   -> elseif new.math > 100 then
   -> set new.math=100;
   
   -> elseif new.english < 0 then
   -> set new.englisn=0;
   
   -> elseif new.english > 100 then
   -> set new.english=100;
   -> end if;
   -> end
   -> //
 
  查看触发器信息
 mysql> show triggers\G
 mysql> select * from information_schema.triggers\G
 
 删除触发器
 mysql> drop trigger tg_sc_up_bf;
   
2.存储过程procedure
mysql> show procedure status;
变量:
全局变量:以@开头,如@var1,设置方法为set @var1 = 1000;select @var1 := 'hello,test!';

系统变量;
系统变量使用@@引用
 
  局部变量:
 局部变量用在begin...end语句中,声明的是局部变量
 delare var1 int;
 set var1=100;

例:存储过程示例
 mysql> create procedure sp1()
   -> begin
   -> declare var1 int;
   -> declare var2 int default 0;  ======default==赋初值
   -> declare var3 varchar(20) charset utf8 default '湖南工业大学';
   -> set var1=10000;
   -> set var2=111;
   -> select var1,var2,var3;
   -> end
   -> //

 1、使用存储过程传递参数
   
   in 传入参数
   out 传出参数
   inout 传入传出参数 

传出参数:
   
   例:使用存储过程统计指定表的记录数,并且记录数能在外面使用
   
   mysql> create procedure sp2(out num int)
   -> begin
   -> select count(*) into num from employees;
   -> end
   -> //

call sp2(@var1)======变量名可以不一样


传入参数:  
   例:使用存储过程创建users表,包含id,name和sex三个字段
   
    mysql> create procedure sp3(id int,name varchar(20),sex enum('man','woman'))======in  可以省略
   -> begin
   -> create table if not exists users
   -> (
   -> id int primary key,
   -> name varchar(20),
   -> sex enum('man','woman')
   -> )engine=innodb charset=utf8;
   -> insert into users values(id,name,sex);
   -> select * from users;
   -> end
   -> //
   
mysql> call sp3(1,'张三','男');
 传入传出参数:
   mysql> create procedure sp3(inout va int)
   -> begin
   -> set va := va + 10;
   -> set va=va+10;
   -> select va+10 into va;
   -> end
   -> //
   
   mysql> set @var1=100;
   mysql> call sp4(@var1);
   mysql> select @var1;
   
  
     存值方法:
   
   
   select .... into var|@var
   select @var := 100
   select emp_no,first_name into var1,var2 from employees \\必须使用declare
                                                                                            进行声明
   select emp_no,first_name into @var1,@var2 from employees
   select @var1 := emp_no,@var2 := first_name from employees
   
   2、mysql编程
  (1)loop循环(无限循环)
     label:loop
        循环体
        if 退出条件
           leave label;
        end if;
       
     end loop;
     
 例:使用存储过程计算指定数字从1开始的和值
 mysql> create procedure sp4(in snum int)
   -> begin
   -> declare sum,i int;
   -> set sum=0,i=0;
   -> sxjy:loop
   -> if i <= snum then
   -> set sum := sum + i;
   -> set i := i + 1;
   -> else
   -> leave sxjy;
   -> end if;
   -> end loop;
   -> select sum
   -> end
   -> //
   
   
    (2)while循环
   leave    跳出循环
   iterate  跳过本次循环
   
   label:while 条件 do
     循环体
   end while
   
    mysql> create procedure sp5(in snum int)
   -> begin
   -> declare sum,i int;
   -> set sum=0,i=0;
   -> while i<= snum do
   -> set sum := sum + i;
   -> set i := i + 1;
   -> end while;
   -> select sum;
   -> end
   -> //
   
 练习:在test数据库下新建test1表,包括
     id    整型,主键
     num1  整型,从1到200的随机数
     dt    datetime类型,为当前系统日期时间
     然后使用while循环插入200条记录
   
   
   mysql> create procedure sp6() begin declare i,rand int declare time datetime set i=0,rand=select ceil(200*RAND()+1) limit 1), time=(select NOW() linit 1); while i<=200 do insert into test1(id,num1,dt) values(i,rand,time); set i := i+1; end while; select * from test1 limit 10; end//
 (3)repeat循环
     repeat
       循环体
     until 条件
     end repeat;
 
  mysql> create procedure sp6(in snum int)
   -> begin
   -> declare sum,i int;
   -> set sum=0,i=0;
   -> repeat
   -> set sum := sum + i;
   -> set i := i + 1;
   -> until i > snum
   -> end repeat;
   -> select sum;
   -> end
   -> //
   
   
   (4)case语句
  case 操作数
   when 条件 then 执行语句;
   when 条件 then 执行语句;
   when 条件 then 执行语句;
   else 执行语句
  end case
 
  例:使用存储过程添加学生,当学生的id除3余0时将学生插入c01班,余1时插入c02班,余2时插入c03
     班,每个班的字段为id,name,age,sex四个字段。
     mysql> create procedure sp6(in id int,in name varchar(20),in age int,in sex enum('man','woman'))
   -> begin
   -> declare num int;
   -> set num=mod(id,3);
   -> case num
   -> when 0 then insert into c01 values(id,name,age,sex);
   -> when 1 then insert into c02 values(id,name,age,sex);
   -> when 2 then insert into c03 values(id,name,age,sex);
   -> else
   -> insert into c01 values(id,name,age,sex);
   -> end case;
   -> end
   -> //
   
   
   
    select case age
   when 20 then 语句;
   when 30 then 语句;
   ....
   else
   语句;
   end case from 表名;
   
   select case
   when age >= 20 && age < 25 then 语句;
   when age >= 25 && age < 30 then 语句;
   ....
   else
   语句;
   end case from 表名;

练习:将employees数据库中,员工的入职时间在1985年到1990年的加薪15%向上取整,入职时间
     在1990年到1995年的加薪10%向上取整,入职时间在1995年到2000年的加薪5%向上取整,
   
   
   
   3、mysql备份和恢复
  mysqldump备份工具
  备份数据库下的表
  # mysqldump -u root -paixocm --opt test c01 c02 c03 > /employees.sql
  # mysql -u root -paixocm --database test < employees.sql
 
  备份指定数据库
  # mysqldump -u root -paixocm --opt --database test > /employees.sql
  # mysql -u root -paixocm < employees.sql
 
  备份所有数据库
  # mysqldump -u root -paixocm --opt --all-databases > /employees.sql
 
  定和解锁所有表
  mysql> FLUSH TABLES WITH READ LOCK;
  mysql> unlock tables;

您可能感兴趣的文档:

--结束END--

本文标题: 触发器和存储过程

本文链接: https://www.lsjlt.com/news/39202.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 触发器和存储过程
    触发器和存储过程   1.触发器   在进行dml操作的时候(insert,update,delete),可以对事件进行监听和响应,这种机制在数据库中叫做触发器。  ...
    99+
    2022-10-18
  • 存储过程和触发器
      一.打开sql server数据库 1. 使用Windows身份验证登入 2. 设置身份验证 3. 切换用户登入sql server ...
    99+
    2022-10-18
  • 索引、视图、存储过程和触发器
    1、索引:数据排序的方法,快速查询数据分类:唯一索引:不允许有相同值主键索引:自动创建的主键对应的索引,命令方式不可删聚集索引:物理顺序与索引顺序一致,只能创建一个非聚集索引:物理顺序与索引顺序不一致,可创...
    99+
    2022-10-18
  • 怎么理解MySQL存储过程和触发器
    这期内容当中小编将会给大家带来有关怎么理解MySQL存储过程和触发器,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。存储过程(stored procedure SP)是My...
    99+
    2022-10-19
  • MySql视图触发器存储过程详解
    视图:   一个临时表被反复使用的时候,对这个临时表起一个别名,方便以后使用,就可以创建一个视图,别名就是视图的名称。视图只是一个虚拟的表,其中的数据是动态的从物理表中读出来的,所以物理表的变更回改变视图。   创...
    99+
    2022-05-12
    MySql 视图 触发器 存储
  • MySQL-SQL存储过程/触发器详解(下)
    ♥️作者:小刘在C站 ♥️个人主页: 小刘主页  ♥️努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏:云计算技术 ♥️小刘私信可以随便问,只要会...
    99+
    2023-09-01
    sql mysql 数据库
  • MySQL查看存储过程和函数、视图和触发器
    1.查询数据库中的存储过程和函数 方法一: select `name` from mysql.proc where db = 'your_db_name' and `type` ...
    99+
    2022-10-18
  • MySQL数据库实验之 触发器和存储过程
    目录一、实验目的二、实验要求三、实现内容及步骤1、创建一个不带参数的简单存储过程2、创建一个带输入参数的存储过程3、创建一个带输入输出参数的存储过程4、触发器的创建与使用四、实验总结观前提示:本篇内容为mysql数据库实...
    99+
    2022-06-20
    MySQL数据库实验 MySQL触发器 MySQL存储过程
  • mysql存储过程和触发器有啥具体区别
    本文主要给大家简单讲讲mysql存储过程和触发器有啥具体区别,相关专业术语大家可以上网查查或者找一些相关书籍补充一下,这里就不涉猎了,我们就直奔主题吧,希望mysql存储过程和触发器有啥具体区别这篇文章可以...
    99+
    2022-10-18
  • 【MySQL进阶教程】视图/存储过程/触发器
    前言 本文为 【MySQL进阶教程】视图/存储过程/触发器 相关知识,下边将对视图,存储过程,存储函数,触发器等进行详尽介绍~ 📌博主主页:小新要变强 的主页 👉Ja...
    99+
    2023-09-18
    mysql 数据库 java
  • mysql转储/恢复存储过程和触发器指的是什么
    这篇文章将为大家详细讲解有关mysql转储/恢复存储过程和触发器指的是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。MySQL5.0首先介绍了存储过程和触发器。因此,...
    99+
    2022-10-18
  • 对比索引、视图、游标、存储过程和触发器
    1、索引        1-1、索引的概述                 我们把一个表中的一列或者多列和列中元素所在表中记录的物理地址组合成一个新的表。这个表的记录大致为列的内容和该列所在记录的物理地址。        1-2、...
    99+
    2020-01-22
    对比索引 视图 游标 存储过程和触发器
  • MySQL系列之五 视图、存储函数、存储过程、触发器
    目录系列教程一、视图 1、视图的创建 2、查看视图定义 3、删除视图 二、存储函数 1、系统函数 2、自定义函数(user-defined function:UDF) 三、存储过程 ...
    99+
    2022-11-12
  • 浅谈MySql 视图、触发器以及存储过程
    视图 什么是视图?视图的作用是什么? 视图(view)是一种虚拟存在的表,是一个逻辑表,它本身是不包含数据的。作为一个select语句保存在数据字典中的。 通过视图,可以展现基表(用来创建视图的表叫做基表...
    99+
    2022-05-18
    MySql 视图 MySql 触发器 MySql 存储过程
  • MySQL数据库的触发器和存储过程实例分析
    这篇文章主要介绍“MySQL数据库的触发器和存储过程实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MySQL数据库的触发器和存储过程实例分析”文章能帮助大家解决问题。一、实验目的掌握某主流D...
    99+
    2023-07-02
  • 数据库中存储过程和触发器有哪些区别
    这篇文章主要讲解了“数据库中存储过程和触发器有哪些区别”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“数据库中存储过程和触发器有哪些区别”吧!什么是触发器?触...
    99+
    2022-10-18
  • oracle 存储过程、函数和触发器用法实例详解
    本文实例讲述了oracle 存储过程、函数和触发器用法。分享给大家供大家参考,具体如下: 一、存储过程和存储函数 指存储在数据库中供所有用户程序调用的子程序叫存储过程、存储函数。 创建存储过程 用CREAT...
    99+
    2022-10-18
  • 数据库优化之创建存储过程、触发器
        存储过程可加快查询的执行速度,提高访问数据的速度,帮助实现模块化编程,保存一致性,提高安全性。触发器是在对表进行插入、更新、删除操作时自动执行的存储过程,通常用于强制业务规则。一...
    99+
    2022-10-18
  • SQLServer中函数、存储过程与触发器的用法
    一、函数 函数分为(1)系统函数,(2)自定义函数。 其中自定义函数又可以分为(1)标量值函数(返回单个值),(2)表值函数(返回查询结果) 本文主要介绍自定义函数的使用。 (1)编...
    99+
    2022-11-13
  • php中怎么调用存储函数和存储过程,它的触发器是什么
    本篇内容介绍了“php中怎么调用存储函数和存储过程,它的触发器是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在php中使用存储函数或存...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作