sql之视图、触发器、函数、存储过程、事务
视图
# 视图也是一张表,但在data文件里只有表结构,没有表数据
# 不建议使用,扩展性差,程序需改变时,依赖的视图也要改变
# 视图牵涉到多张表时,视图中的记录不能修改。
create view course2teacher as select * from course inner join teacher on course.teacher_id = teacher.tid
alter view
select * from course2teacher
触发器
使用触发器可以定制用户对表进行【增、删、改】操作时前后的行为,注意:没有查询
create trigger tri_before_insert_tb1 before insert on tb1 for each row

上图中,delimiter //将原本 ;号的结束符改为//,语句写完后,又换成 ;结束符。
NEW 表示即将插入的数据行,OLD表示即将删除的数据行。
使用触发器:无法由用户直接调用,而是由于对表的增删改操作被动引发。
删除触发器:drop triggeer tri_after_insert_cmd。
触发器的逻辑尽量在应用程序里写,否则还要找数据库人员修改触发器。
函数
内置函数,写在select后面,有char_length(),date_format()等
自定义函数,
create function f1(
t1 int,
t2 int)
return int
BEGIN
declare num int;
set num = t1+t2;
return num;
END //
delimiter ;
存储过程
# 无参存储过程
delimiter //
create procedure p1()
BEGIN
select * from db1.teacher;
END //
delimiter ;
show create procedure p1; # 查看存储过程
# 在MySQL中调用
call p1();
# 在Python中调用
cursor.call_proc('p1')
# 有参存储过程
delimiter //
create procedure p2(
in n1 int,
in n2 int,
out res int , # 用于标识执行结果
inout n3 int)
BEGIN
select * from db1.teacher where tid > n1 and tid < n2;
set res = 1; # res是out伪造的返回值,如果要取select语句返回的表格,需从@_p2_0和@_P2_1中取
# 为什么有结果集又有out伪造的返回值?
END //
delimiter ;
# 在MySQL中调用
set @x=0 # 给session级别的变量设值
call p2(2,4,@x);
select @x;
# 在Python中调用
cursor.call_proc('p2',(2,4,0)) #@_p2_0 = 2,@_P2_1=4,
拿返回值需再进行一次查询
cursor.execute('select @_p2_0,@_P2_1,@_p2_2')
cursor.fetchone()
有了存储过程后,真正实现了应用程序和数据库的集成开发。
应用程序和数据库结合的三种方式:
方式一:只需通过网络发存储过程名
Python调用存储过程
MySQL编写存储过程
方式二:
Python编写原生SQL语句
方式三:
Python用ORM框架生成SQL语句
事务
事务常被用于存储过程中
事务用于将某些操作的多个sql作为原子性操作,一旦有某一个出现错误,即可回滚到原来的状态,从而保证数据库数据完整性。
delimiter //
create procedure p4(
out status int
)
BIGIN
DECLARE exit handler for sqlexception
BEGIN
-- ERROR
set p_return_code = 1;
rollback;
END
start transaction;
update user set balance = 900 where name='wdb'; # 购买支付100元
user set balance = 1010 where name='egon' # 商家增加10元
commit;
--SUCCESS
set p_return_code = 2;
END //
delimiter ;

通过游标实现循环的存储过程
delimiter //
create procedure p6()
begin
declare row_id int;
declare row_num varchar(50);
declare done int default false;
declare my_cursor cursor for select id,num from A;
declare continue handler for not found set done = true;
open my_cursor;
xxoo: LOOP
fetch my_cursor into row_id,row_num;
if done then
leave xxoo;
end if;
set temp = row_id + row_num
insert into B(num) values(temp);
end loop xxoo;
close my_cursor;
end //
delimiter ;
动态执行sql,(防sql注入)
delimiter //
create procedure p7(
in tpl varchar(255),
in arg int
)
begin
1、预检测sql语句合法性
2、sql = 格式化 tpl + arg
3、执行sql语句
set @xo = arg;
prepare xxx from 'select * from student where sid >?';
execute xxx using @xo;
deallocate prepare prod;
end //
delimiter ;
sql之视图、触发器、函数、存储过程、事务的更多相关文章
- python 全栈开发,Day64(视图,触发器,函数,存储过程,事务)
昨日内容回顾 pymysql:属于python的一个模块 pip3 install pymysql conn = pymysql.connect(...,charset = 'uft8') 创建游标 ...
- mysql 查询表,视图,触发器,函数,存储过程
1. mysql查询所有表: SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '数据库名' AND TAB ...
- MySQL 查询 存储过程 视图 触发器 函数 索引 建表语句 数据库版本 当前登录用户 当前数据库名称
MySQL 查询 存储过程 视图 触发器 函数 索引 建表语句 数据库版本 当前登录用户 当前数据库名称 INFORMATION_SCHEMA.TABLES INFORMATION_SCHEMA. ...
- MySQL 5.6 主从复制如何处理——触发器,函数,存储过程,调度事件
截图来自MySQL5.6的pdf版文档. 说明: 1)基于语句的复制时,trigger会在slave上执行,所以slave上也需要有trigger的定义,不然会导致主从数据不一致的: 2)基于行的 ...
- mysql 视图 触发器 事物 存储过程 函数 流程控制
1.视图 *** 视图是有一条sql语句的查询结果构成的虚拟表 其不是物理存在的 使用方式与普通表相同 视图的作用1.简化sql语句的编写 2.限制可以查看的数据 可以使用权限来完成 权限某一个库 的 ...
- Python9-MySQL-MySQL存储过程-视图-触发器-函数-day45
视图:某个查询语句设置别名,日后方便使用 CREATE VIEW v1 as SELECT * FROM student WHERE sid >10 -创建: create view 视图名称 ...
- python mysql 视图 触发器 事物 存储过程 用户授权 数据备份还原
###################总结########### 视图是一个虚拟表(非真实存在) 是跑在内存中的表,真实表是在硬盘上的表 使用视图我们可以把查询过程中的临时表摘出来,保存下来,用视图去 ...
- mysql 视图/触发器/函数
一.视图 作用:简写代码,与临时表的作用差不多 .创建 create view 视图名 as SQL语句 .修改 alter view 视图名 as 新SQL语句 .删除 drop view 视图名 ...
- 数往知来SQL SERVER 视图 触发器 <九>
SQL server学习_视图 1.视图 视图其实是一张虚拟表,他是一张表的部分数据或多张表的综合数据(视图就是把SQL语句封装起来) 可以看做是一个结果集,但是不是一个结果集 视图不具备存储数据的能 ...
- Database学习 - mysql 视图/触发器/函数
随机推荐
- ElasticSearchserver操作命令
在win7环境,进入elasticsearch安装文件夹的bin文件夹: 1. elasticsearch.bat 就能够启动elasticsearch了.执行这个插件的优点是:elasticsear ...
- 如何成为一个Linux内核开发者
你想知道如何成为一个Linux内核开发者么?或者你的老板告诉你,“去为这个设备写一个Linux驱动.“这篇文档的目的,就是通过描述你需要 经历的过程和提示你如何和社区一起工作,来教给你为达到这些目的所 ...
- liunx安装redis和gcc
首先去上下载redis,我现在用的版本是:redis-3.0.4.tar.gz 然后放到虚拟机里面解压,下面是三种解压命令: tar -zxvf file.tar.gz tar -jcvf file ...
- 韦东山 第9课第1节.u-boot分析之编译体验 http://www.100ask.net/index.html
http://www.100ask.net/index.html 韦东山官网网址 http://wenku.baidu.com/view/ae78a00390c69ec3d5bb75ce.html h ...
- mnesia练习及基本操作
Mnesia基本用法 查看表结构 查看mnesia表的结构: mnesia:info(). 查看此表的基本信息: mnesia:table_info(<tableName>, all). ...
- teradata培训文档 相关索引
teradata培训文档 http://wenku.baidu.com/view/ec44c201cc175527072208ba.html Teradata 和Greenplum 的讨论 http: ...
- CentOS 安装和配置 Mantis
Mantis是一个基于PHP技术的轻量级的开源缺陷跟踪系统,以Web操作的形式提供项目管理及缺陷跟踪服务.在功能上.实用性上足以满足中小型项目的管理及跟踪.更重要的是其开源,不需要负担任何费用. 1. ...
- repeter中应用三元运算符
应用情景一:根据ID显示名称例如:0代表启动,1:代表关闭例子如下 <td><%#Eval("ID").ToString() == "0" ? ...
- 九度OJ 1102:最小面积子矩阵 (DP、缓存、剪枝)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1666 解决:504 题目描述: 一个N*M的矩阵,找出这个矩阵中所有元素的和不小于K的面积最小的子矩阵(矩阵中元素个数为矩阵面积) 输入: ...
- Requires: libstdc++.so.6(GLIBCXX_3.4.15)(64bit)
Error: Package: mysql-community-server-8.0.12-1.el7.x86_64 (mysql80-community) Requires: libstdc++.s ...