MySQL数据库之触发器、游标、视图

触发器:是一个特殊的存储过程,不同的是,执行存储过程要 使用CALL语句来调用,而触发 器的执行不需要使用CALL语句来调用,也 不需要手工启动,只要当一个预定义的事件发生的时候,就会 被MySQL自动调用。比如当对fruits表进行操作(INSERT、DELETE或UPDATE)时就会激活它执行。

作用:1、可在写入数据前,强制检验或者转换数据(保证护数据安全)
2、触发器发生错误时,前面用户已经执行成功的操作会被撤销,类似事务的回滚

在MySQl中由于MySQL的原因,只能使用行级触发器,不能使用语句级触发器。

delimiter 自定义结束符号
create trigger 触发器名字 触发时间 触发事件 on 表 for each row
begin
    -- 触发器内容主体,每行用分号结尾
end
自定义的结束符合

delimiter ;

 

触发时间

当 SQL 指令发生时,会令行中数据发生变化,而每张表中对应的行有两种状态:数据操作前和操作后

before:表中数据发生改变前的状态
after:表中数据发生改变后的状态
PS:如果 before 触发器失败或者语句本身失败,将不执行 after 触发器(如果有的话)

触发事件

触发器是针对数据发送改变才会被触发,对应的操作只有

INSERT
DELETE
UPDATE

注意事项

在 MySQL 5 中,触发器名必须在每个表中唯一,但不是在每个数据库中唯一,即同一数据库中的两个表可能具有相同名字的触发器
每个表的每个事件每次只允许一个触发器,因此,每个表最多支持 6 个触发器,before/after insert、before/after delete、before/after update

查看触发器
1.查看全部触发器

语法:show triggers;

2.查看触发器的创建语句

语法:show create trigger 触发器名字;

触发触发器

触发不是自动手动触发的,而是在对应的事件发生后才会触发。比如我们创建的触发器,只有在对订单表进行数据操作的时候,触发器才会执行

删除触发器

触发器不能修改,只能删除

语法:drop trigger + 触发器名字;

流程语句

if语句

DELIMITER $$
	CREATE TRIGGER tri_04 AFTER INSERT ON sale FOR EACH ROW
	BEGIN
		DECLARE _num INT;
		SELECT goodsNum INTO _num FROM goods WHERE goodsId=new.goodsId;
		IF _num>new.num THEN
			UPDATE goods SET goodsnum=goodsnum-new.num WHERE
goodsid=new.goodsId;
		END IF;
	END$$
DELIMITER ;

 循环语句

DELIMITER $$
	CREATE PROCEDURE pro_01(num INT)
	BEGIN
		DECLARE _sum INT DEFAULT 0;
		DECLARE _i INT DEFAULT 1;
		WHILE _i<=num DO
			SET _sum=_sum+_i;
			SET _i=_i+1;
		END WHILE;
		SELECT _sum;
	END$$
DELIMITER ;

DELIMITER $$
	CREATE PROCEDURE pro_02(num INT)
	BEGIN
		DECLARE _sum INT DEFAULT 0;
		DECLARE _i INT DEFAULT 1;
		a:LOOP
			IF _i>num THEN
				LEAVE a;
			END IF;
			SET _sum=_sum+_i;
			SET _i=_i+1;
		END LOOP;
		SELECT _sum;
	END$$
DELIMITER ;


DELIMITER $$
	CREATE PROCEDURE pro_03(num INT)
	BEGIN
		DECLARE _sum INT DEFAULT 0;
		DECLARE _i INT DEFAULT 1;
		REPEAT
			SET _sum=_sum+_i;
			SET _i=_i+1;
		UNTIL _i>num END REPEAT;
		SELECT _sum;
	END$$
DELIMITER ;

 游标

游标是处理多行数据的,游标需要开启,抓取,关闭的

DELIMITER $$
CREATE PROCEDURE pro_04()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE _typeid VARCHAR(50);
DECLARE _typename VARCHAR(50);
DECLARE _typedes VARCHAR(50);
DECLARE cur_type CURSOR FOR SELECT * FROM producttype;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
OPEN cur_type;//开启游标
loopname:LOOP
FETCH cur_type INTO _typeid,_typename,_typedes;//抓取游标
IF done=1 THEN
LEAVE loopname;
END IF;
INSERT type_bak VALUES(_typeid,_typename,_typedes);
END LOOP;
CLOSE cur_type;//关闭游标
END$$
DELIMITER ;

 视图:视图是一个虚拟表,是从数据库中一个或多个表中导出来的表。视图还可以从已经存在的视图的基 础上定义。

视图特点: 1>简单化:看到的就是需要的。视图不仅可以简化用户对数据的理解,也可以简化它们的 操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件

        2>安全性:通过视图用户只能查询和修改他们所能见到的数据。数据库中的其他数据则既 看不见也取不到。

         3>逻辑数据独立性:视图可帮助用户屏蔽真实表结构变化带来的影响。

创建视图的语法

CREATE VIEW viewname AS SELECT .....

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值