触发器:是一个特殊的存储过程,不同的是,执行存储过程要 使用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 .....