MySQL触发器、游标与视图

触发器:

一、基本概念
触发器是一种特殊类型的存储过程,它不同于存储过程,主要是通过事件触发而被执行的,即不是主动调用而执行的;而存储过程则需要主动调用其名字执行

触发器:trigger,是指事先为某张表绑定一段代码,当表中的某些内容发生改变(增、删、改)的时候,系统会自动触发代码并执行。

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

基本语法
for each row 行级触发器

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

delimiter ;

MySQL不支持语句级触发器

触发时间

当 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 ;

视图
数据库中的视图是一个虚拟表。同真实的表一样,视图包含一系列带有名称的行和列数据。行和列
数据来自由定义视图查询所引用的表,并且在引用视图时动态生成。视图是从一个或者多个表中导出
的,视图的行为与表非常相似,但视图是一个虚拟表。在视图中用户可以使用SELECT语句查询数据。
视图是一个虚拟表,是从数据库中一个或多个表中导出来的表。视图还可以从已经存在的视图的基
础上定义。
视图特点: 1>简单化:看到的就是需要的。视图不仅可以简化用户对数据的理解,也可以简化它们的
操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件
2>安全性:通过视图用户只能查询和修改他们所能见到的数据。数据库中的其他数据则既
看不见也取不到。
3>逻辑数据独立性:视图可帮助用户屏蔽真实表结构变化带来的影响。
视图主要做查看,不做insert,update,delete。虽然单表创建的视图,可以执行,但不推荐。多表创
建视图无法执行以上操作。
创建视图的语法:

CREATE VIEW viewname AS SELECT ......
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值