本篇文章小编给大家分享一下MySql视图触发器存储过程代码解析,代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
视图:
一个临时表被反复使用的时候,对这个临时表起一个别名,方便以后使用,就可以创建一个视图,别名就是视图的名称。视图只是一个虚拟的表,其中的数据是动态的从物理表中读出来的,所以物理表的变更回改变视图。
创建:
create view v1 as SQL
例如:create view v1 as select * from student where sid<10
创建后如果使用mysql终端可以看到一个叫v1的表,如果用navicate可以在视图中看到生成了一个v1的视图
再次使用时,可以直接使用查询表的方式。例如:select * from v1
修改:只能修改视图中的sql语句
alter view 视图名称 as sql
删除:
drop view 视图名称
触发器:
当对某张表做增删改查的时候(之前后者之后),就可以使用触发器自定义关联行为。
修改sql语句中的终止符号 delimiter
before after 之前之后
-- delimiter // -- before或者after定义操作(insert或其他)之前或之后的操作 -- on 代表那张表发生操作后引发触发器操作 -- CREATE TRIGGER t1 BEFORE INSERT on teacher for EACH row -- BEGIN -- INSERT into course(cname) VALUES('奥特曼'); -- END // -- delimiter ; -- insert into teacher(tname) VALUES('triggertest111') -- -- delimiter // -- CREATE TRIGGER t1 BEFORE INSERT on student for EACH row -- BEGIN -- INSERT into teacher(tname) VALUES('奥特曼'); -- END // -- delimiter ; -- insert into student(gender,sname,class_id) VALUES('男','1小刚111',3); -- 删除触发器 -- drop trigger t1; -- NEW 和 OLD 代指新老数据 使其数据一致 -- delimiter // -- create TRIGGER t1 BEFORE insert on student for each row -- BEGIN --这里的new 指定的是新插入的数据,old通常用在delete上 -- insert into teacher(tname) VALUES(NEW.sname); -- end // -- delimiter ; insert into student(gender,sname,class_id) VALUES('男','蓝色的大螃蟹',3);
存储过程:
本质上就是一堆sql的集合,然后给这个集合起个别名。和view的区别就是,视图是一个sql查询语句当成一个表。
方式:
1 msyql----存储过程,供程序调用
2 msyql---不做存储过程,程序写sql
3 mysql--不做存储过程,程序写类和对象(转化成sql语句)
创建方法:
-- 1 创建无参数的存储过程
-- delimiter //
-- create PROCEDURE p1()
-- BEGIN
-- select * from student;
-- insert into teacher(tname) VALUES('cccc');
-- end //
-- delimiter ;
-- 调用存储过程
call p2(5,2)
pymysql中 cursor.callproc('p1',(5,2))
-- 2 带参数 in 参数 -- delimiter // -- create PROCEDURE p2( -- in n1 int, -- in n2 int -- ) -- BEGIN -- select * from student where sid
call p2(5,2)
pymysql中 cursor.callproc('p1',(5,2))
-- 3 out参数 在存储过程入参时 使用out则 该变量可以在外部进行调用 -- 存储过程中没有return 如果想要在外部调用变量则需要使用out -- delimiter // -- create PROCEDURE p3( -- in n1 int, -- out n2 int -- ) -- BEGIN -- set n2=444444; -- select * from student where sid为什么有了结果集,又要有out伪造返回的值?
因为存储过程中含有多个sql语句,无法判断所有的sql都能执行成功,利用out的特性来标识sql是否执行成功。
例如,如果成功标识为1 部分成功标识2 失败为3
存储过程中的事务:
事务:
被成为原子性操作。DML(insert,update,delete)语句共同完成,事物只和DML语句相关,或者锁只有DML才有事物。
事务的特点:
原子性 A :事务是最小单位,不可分割
一致性 C :事务要求所有dml语句操作的时候必须保证全部成功或者失败
隔离性 I : 事务A和事务B之间有隔离性
持久性 D : 是事务的保证,事务终结的标志(内存中的数据完全保存到硬盘中)
事务关键字:
开启事务:start transaction
事务结束 :end transaction
提交事务 :commit transaction
回滚事务 :rollback transaction
事务的基本操作
delimiter // create procedure p5( in n1 int, out n2 int ) begin 1 声明如果出现异常执行( set n2=1; rollback; ) 2 开始事务 购买方账号-100 卖放账号+100 commit 3 结束 set n2=2 end // delimiter ; 这样 既可以通过n2 检测后到错误 也可以回滚 以下是详细代码 delimiter // create procedure p6( out code TINYINT ) begin 声明如果碰到sqlexception 异常就执行下边的操作 DECLARE exit HANDLER for SQLEXCEPTION begin --error set code=1; rollback; end; START TRANSACTION; delete from tb1; insert into tb2(name)values('slkdjf') commit; ---success code=2 end // delimiter ;游标在存储过程中的使用:
delimiter // create procedure p7() begin declare row_id int; declare row_num int; declare done int DEFAULT FALSE; 声明游标 declare my_cursor cursor for select id,num from A; 声明如果没有数据 则将done置为True declare continue handler for not found set done=True; open my_cursor; 打开游标 xxoo;LOOP 开启循环叫xxoo fetch my_cursor into row_id,row_num; if done then 如果done为True 离开循环 leave xxoo; end if; set temp=row_id+row_num; insert into B(number)VALUES(temp); end loop xxoo; 关闭循环 close my_cursor; end // delimiter ; 以上代码 转化成python for row_id,row_num in my_cursor: 检测循环中是否还有数据,如果没有则跳出 break break insert into B(num) values(row_id+row_num)动态的执行sql,数据库层面放置sql注入:
delimiter create procedure p6( in nid int) begin 1 预编译(预检测)某个东西 sql语句合法性 2 sql=格式化tpl+arg 3 执行sql set @nid=nid prepare prod from 'select * from student where sid>?' EXECUTE prod using @ nid; deallocate prepare prod end delimiter ;
忍者必须死34399账号登录版 最新版v1.0.138v2.0.72
下载勇者秘境oppo版 安卓版v1.0.5
下载忍者必须死3一加版 最新版v1.0.138v2.0.72
下载绝世仙王官方正版 最新安卓版v1.0.49
下载Goat Simulator 3手机版 安卓版v1.0.8.2
Goat Simulator 3手机版是一个非常有趣的模拟游
Goat Simulator 3国际服 安卓版v1.0.8.2
Goat Simulator 3国际版是一个非常有趣的山羊模
烟花燃放模拟器中文版 2025最新版v1.0
烟花燃放模拟器是款仿真的烟花绽放模拟器类型单机小游戏,全方位
我的世界动漫世界 手机版v友y整合
我的世界动漫世界模组整合包是一款加入了动漫元素的素材整合包,
我的世界贝爷生存整合包 最新版v隔壁老王
我的世界MITE贝爷生存整合包是一款根据原版MC制作的魔改整