MySql视图触发器存储过程详解
视图:
一个临时表被反复使用的时候,对这个临时表起一个别名,方便以后使用,就可以创建一个视图,别名就是视图的名称。视图只是一个虚拟的表,其中的数据是动态的从物理表中读出来的,所以物理表的变更回改变视图。
创建:
createviewv1asSQL
例如:createviewv1asselect*fromstudentwheresid<10
创建后如果使用mysql终端可以看到一个叫v1的表,如果用navicate可以在视图中看到生成了一个v1的视图
再次使用时,可以直接使用查询表的方式。例如:select*fromv1
修改:只能修改视图中的sql语句
alterview视图名称assql
删除:
dropview视图名称
触发器:
当对某张表做增删改查的时候(之前后者之后),就可以使用触发器自定义关联行为。
修改sql语句中的终止符号delimiter
beforeafter之前之后
--delimiter// --before或者after定义操作(insert或其他)之前或之后的操作 --on代表那张表发生操作后引发触发器操作 --CREATETRIGGERt1BEFOREINSERTonteacherforEACHrow --BEGIN --INSERTintocourse(cname)VALUES('奥特曼'); --END// --delimiter; --insertintoteacher(tname)VALUES('triggertest111') -- --delimiter// --CREATETRIGGERt1BEFOREINSERTonstudentforEACHrow --BEGIN --INSERTintoteacher(tname)VALUES('奥特曼'); --END// --delimiter; --insertintostudent(gender,sname,class_id)VALUES('男','1小刚111',3); --删除触发器 --droptriggert1; --NEW和OLD代指新老数据使其数据一致 --delimiter// --createTRIGGERt1BEFOREinsertonstudentforeachrow --BEGIN --这里的new指定的是新插入的数据,old通常用在delete上 --insertintoteacher(tname)VALUES(NEW.sname); --end// --delimiter; insertintostudent(gender,sname,class_id)VALUES('男','蓝色的大螃蟹',3);
存储过程:
本质上就是一堆sql的集合,然后给这个集合起个别名。和view的区别就是,视图是一个sql查询语句当成一个表。
方式:
1msyql----存储过程,供程序调用
2msyql---不做存储过程,程序写sql
3mysql--不做存储过程,程序写类和对象(转化成sql语句)
创建方法:
--1创建无参数的存储过程
--delimiter//
--createPROCEDUREp1()
--BEGIN
--select*fromstudent;
--insertintoteacher(tname)VALUES('cccc');
--end//
--delimiter;
--调用存储过程
callp2(5,2)pymysql中cursor.callproc('p1',(5,2))
--2带参数in参数 --delimiter// --createPROCEDUREp2( --inn1int, --inn2int --) --BEGIN --select*fromstudentwheresidcallp2(5,2) pymysql中cursor.callproc('p1',(5,2))
--3out参数在存储过程入参时使用out则该变量可以在外部进行调用 --存储过程中没有return如果想要在外部调用变量则需要使用out --delimiter// --createPROCEDUREp3( --inn1int, --outn2int --) --BEGIN --setn2=444444; --select*fromstudentwheresid为什么有了结果集,又要有out伪造返回的值?
因为存储过程中含有多个sql语句,无法判断所有的sql都能执行成功,利用out的特性来标识sql是否执行成功。
例如,如果成功标识为1部分成功标识2失败为3
存储过程中的事务:
事务:
被成为原子性操作。DML(insert,update,delete)语句共同完成,事物只和DML语句相关,或者锁只有DML才有事物。
事务的特点:
原子性A:事务是最小单位,不可分割
一致性C:事务要求所有dml语句操作的时候必须保证全部成功或者失败
隔离性I:事务A和事务B之间有隔离性
持久性D:是事务的保证,事务终结的标志(内存中的数据完全保存到硬盘中)
事务关键字:
开启事务:starttransaction
事务结束:endtransaction
提交事务:committransaction
回滚事务:rollbacktransaction
事务的基本操作
delimiter// createprocedurep5( inn1int, outn2int ) begin 1声明如果出现异常执行( setn2=1; rollback; ) 2开始事务 购买方账号-100 卖放账号+100 commit 3结束 setn2=2 end// delimiter; 这样既可以通过n2检测后到错误也可以回滚 以下是详细代码 delimiter// createprocedurep6( outcodeTINYINT ) begin 声明如果碰到sqlexception异常就执行下边的操作 DECLAREexitHANDLERforSQLEXCEPTION begin --error setcode=1; rollback; end; STARTTRANSACTION; deletefromtb1; insertintotb2(name)values('slkdjf') commit; ---success code=2 end// delimiter;游标在存储过程中的使用:
delimiter// createprocedurep7() begin declarerow_idint; declarerow_numint; declaredoneintDEFAULTFALSE; 声明游标 declaremy_cursorcursorforselectid,numfromA; 声明如果没有数据则将done置为True declarecontinuehandlerfornotfoundsetdone=True; openmy_cursor;打开游标 xxoo;LOOP开启循环叫xxoo fetchmy_cursorintorow_id,row_num; ifdonethen如果done为True离开循环 leavexxoo; endif; settemp=row_id+row_num; insertintoB(number)VALUES(temp); endloopxxoo;关闭循环 closemy_cursor; end// delimiter; 以上代码转化成python forrow_id,row_numinmy_cursor: 检测循环中是否还有数据,如果没有则跳出break break insertintoB(num)values(row_id+row_num)动态的执行sql,数据库层面放置sql注入:
delimiter\\ createprocedurep6( innidint) begin 1预编译(预检测)某个东西sql语句合法性 2sql=格式化tpl+arg 3执行sql set@nid=nid prepareprodfrom'select*fromstudentwheresid>?' EXECUTEprodusing@nid; deallocateprepareprod end\\ delimiter;以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。