触发器:
一、基本概念
触发器是一种特殊类型的存储过程,它不同于存储过程,主要是通过事件触发而被执行的,即不是主动调用而执行的;而存储过程则需要主动调用其名字执行
触发器:trigger,是指事先为某张表绑定一段代码,当表中的某些内容发生改变(增、删、改)的时候,系统会自动触发代码并执行。
二、作用
1、可在写入数据前,强制检验或者转换数据(保证护数据安全)
2、触发器发生错误时,前面用户已经执行成功的操作会被撤销,类似事务的回滚
基本语法
for each row 行级触发器
delimiter 自定义结束符号
create trigger 触发器名字 触发时间 触发事件 on 表 for 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 ......