mysql 视图 触发器 事物 存储过程 函数 流程控制
1.视图 *** 视图是有一条sql语句的查询结果构成的虚拟表 其不是物理存在的 使用方式与普通表相同
视图的作用
1.简化sql语句的编写
2.限制可以查看的数据
可以使用权限来完成 权限某一个库 的某一个表 的某一个字段
例如:一张表存储了所有人的工资 但是每个员工只能看自己的工资信息 那就可以用视图来限制
视图的特点:
对于视图的增删改查 都会同步到原始表
每一次对视图的查询 本质上都是 执行了之前创建视图时 指定的sql语句
对于原始表的修改 也能在视图中查看到 前提是 你修改的数据 包含在创建视图时指定的sql语句中
select *from users where name = toms;
创建视图 语法
create [or replace] view view_name as sql语句;
修改
alter view view_name as sql语句;
删除
drop view view_name;
2.触发器 *** 是一段与某个表有关的mysql程序 当达到某种条件时,触发某个东西的执行
条件:
时间点 before | after
具体事件
update | delete | insert
new old old new
达到条件后:
自动执行一段mysql程序
作用:
做一个博客系统
需要在你执行更新时 自动记录更新时间 以及更新具体内容
python 是什么玩意儿? 第一次编辑
python 是什么玩意儿? 是一门编程语言 第一次编辑
总的来说就是 可以帮你在 一个表被修改时 做一些额外的操作
语法:
create trigger name after delete on tablename for each row
begin
# 具体要执行的操作
end
在触发器中有两个隐藏对象
new(新的数据) 和 old(旧的数据)
案例:
创建一个博客表
id title content commit_time
更新记录表
id content update_time b_id
创建触发器
在 blog表发生了update事件时 要自动将更新后的数据插入 记录表
# 重定义结束符为 // 因为触发器中包含; 而分号是默认的结束符
delimiter //
create trigger t1 after update on blog for each row
begin
insert into update_log values(null,new.content,now(),new.id);
end //
delimiter ;
select *from users //
案例2:
cmd表
存储的是 什么时间执行了 什么指令 结果是什么?
errlog 表 存储的是 所有执行失败的指令信息
当数据插入cmd表时 判断 如果 success 为no 就将这个信息插入errlog表中
delimiter ||
create trigger t3 after insert on cmd for each row
begin
select *from cmd;
if new.success = "no" then
insert into errlog values(null,new.cmd,now());
end if;
end ||
delimiter ;
# 触发器 不会影响原表的操作 只是增加一些额外的操作
注意: a 和 b b 有外键 关联a的主键 并且设置级联 删除 和更新 当删除a中的记录时 不会触发b表触发器
mysql 最想干的事情 就是 把与数据相关的所有逻辑代码全部放mysql中 这样应用程序的操作减少了
3.事务 ** 事务是逻辑上一组sql语句的集合 特点是:一个事务的所有sql语句 要么全部执行成功 要么全部失败
一个转账操作
从a账户 减去100
update account set money = money - 100 where name = "高根";
在给b账户 加上100
update account set money = money + 100 where name = "矮根";
使用案例
# 开启事务
start transaction;
# 一堆sql
update account set money = money - 100 where name = "高根";
update account set money = moneys + 100 where name = "矮根";
# 如果发生一些错误 可以回滚
rollback;
# 如果没有问题就提交 只有执行了提交操作 你的修改才会生效
commit;
# 一旦commit 就无法在回滚了
rollback 是全部撤销(回滚)
savepoint 可以创建保存点(游戏的存档) 可以选择性的回滚一部分
事务最强大的地方在于 当发生了一些不可控因素时(火山爆发,断电,系统崩溃,网络中断) 可以保证数据是完整的 (原子性)
事务的四个特征 原子性 一个事务是一个整体 不可拆分 要么都成功 要么都失败 一致性 一个事务无论成功或失败 相关数据的约束一定是完整的 隔离性 与效率息息相关 两个事务之间相互独立
事务四个级别的锁
read_uncommitted --不做任何隔离,可能脏读(读取到其他事务未提交的数据)
read_committed----可以防止脏读,不能防止不可重复读(并发修改),和幻读(并发添加和删除),
对于同一条记录 同一事务的两次查询结果不一致 称之为不可重复度
start transaction
select *from account where name = "张三"; # 有1000块
select *from account where name = "张三"; # 0
原因是:一个事务在查询数据 另一个在更新数据
幻觉
select count(*) from account; 本来有8个人
一段时间后
select count(*) from account; 本来有9个人
本质原因 : 一个事务在查询 另一个事务在添加/删除数据
# 可重复度
Repeatable_read --可以防止脏读,不可重复读(加锁保证 查询事务和更新事务不能并发),不能防止 幻读
insert/delete 和查询事务 可以并发执行
# 最严格的锁
Serializable--数据库运行在串行化实现,所有问题都没有,就是性能低
永久性 一个事务一旦提交,就是永久性的 无法回滚
查看当前隔离级别
select @@tx_isolation;
设置新的隔离级别
set global transaction isolation level Serializable;
mysql主从复制 解决高并发问题
4.存储过程 * 一个存储过程中包含任意sql语句,以及流程控制,事务等等.... 简答的就说 将一系列较为复杂的逻辑封装到了mysql中 好处: 例如要是注册功能 接收用户名 密码 判断用户名是否存在 需要编写一条sql语句 传给服务器 服务器执行完毕返回结果 客户端在发起请求 把用户名 和密码传给服务器
经历了至少2次网络传输
如果使用存储过程 就可以一次性将用户名和密码传给服务器 等到接收结果即可
降低了网络传输 提高了效率
弊端: 学习成本高,运营成本高,沟通成本高 三高
正常开发中有三种常见方式完成数据库相关操作
1.应用程序开发者 只关注业务逻辑 数据相关的逻辑交给存储过程
优点: 优化了网络传输 耦合度降低
弊端:学习成本高,运营成本高,沟通成本高 三高 存储过程移植性非常差 每种数据语法都不同
2.应用程序开发者 不仅关注业务逻辑 还需要编写原生的sql语句
优点: 一个人负责所有 没有沟通成本
缺点: sql语句编写繁琐 导致开发效率降低
3.应用程序开发者 仅关注业务逻辑 把sql语句相关的交给ORM(对象关系映射 帮你封装了增删改查 自动生成sql语句)
优点: 开发效率提高了
缺点: 执行效率较低
1.创建存储过程
create procedure p1(type 参数名 数据类型)
type: in输入参数 out输出参数 inout既能输出又能输入
需求 编写一个存储过程 查询 account 表 可以指定 工资的区间范围
select *from account where money >= a and money <= b;
delimiter //
create procedure p1(in a double,in b double)
begin
select *from account where money >= a and money <= b;
end//
delimiter ;
存储过程 与函数的区别
函数仅仅是一个单纯工具 与数据无关 所以函数中不能出现sql语句
存储过程 既可以包含mysql的逻辑代码 也能包含sql语句
delimiter //
create procedure p2(in a double,in b double,out res char(20))
begin
select *from account where money >= a and money <= b;
set res = "success";
end//
delimiter ;
# 输出参数 必须是一个变量 用@定义变量
mysql 视图 触发器 事物 存储过程 函数 流程控制的更多相关文章
- MySQL 视图 触发器 事务 存储过程 函数 流程控制 索引与慢查询优化
视图 1.什么是视图? 视图就是通过查询得到的一张虚拟表,然后保存下来,下次可直接使用 2.为什么要使用视图? 如果要频繁使用一张虚拟表,可以不用重复查询 3.如何使用视图? create view ...
- MySQL——视图/触发器/事务/存储过程/函数/流程控制
一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...
- MySQL视图,触发器,事务,存储过程,函数
create triggr triafterinsertcmdlog after insert on cmd_log FOR EACH ROW trigger_body .#NEW : 代表新的记录 ...
- python mysql 视图 触发器 事物 存储过程 用户授权 数据备份还原
###################总结########### 视图是一个虚拟表(非真实存在) 是跑在内存中的表,真实表是在硬盘上的表 使用视图我们可以把查询过程中的临时表摘出来,保存下来,用视图去 ...
- MySQL 视图触发器事务存储过程函数
事务 致命三问 什么是事务:开启了一个包含多条SQL语句的事务,这些SQL语句要么都执行成功,要么有别想成功:例如A向B转账,二人账户并不属于一家银行,在转账过程中由于网络问题,导致A显示转账 成功 ...
- mysql视图 触发器 事物 函数 存储过程
一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...
- MySQL_视图/触发器/事务/存储过程/函数
视图.触发器.事务.存储过程.函数 视图 视图是一个虚拟表(非真实存在),其本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用名称即可获取结果集,可以将该结果集当作表来使用 #创建视 ...
- MySQL数据库(六) —— SQL注入攻击、视图、事物、存储过程、流程控制
SQL注入攻击.视图.事物.存储过程.流程控制 一.SQL注入攻击 1.什么是SQL注入攻击 import pymysql conn = pymysql.Connect( user="roo ...
- mysql 视图 触发器 存储过程 函数事务 索引
mysql 视图 触发器 存储过程 函数事务 索引 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当 ...
随机推荐
- Codeforces 1065E(计数)
题目链接 题意 限定字符串长度为$n$,字符集规模为$A$,以及$m$个数字$b$,对于任意数字$bi$满足长度为$bi$的前缀和后缀先反转再交换位置后形成的新串与原串视作相等,问存在多少不同串. 思 ...
- 第25月第9天 tf_tang_poems kaggle
1.neural-style https://github.com/anishathalye/neural-style wget http://www.vlfeat.org/matconvnet/mo ...
- 【译】第六篇 SQL Server安全执行上下文和代码签名
本篇文章是SQL Server安全系列的第六篇,详细内容请参考原文. SQL Server决定主体是否有必要的执行代码权限的根本途径是其执行上下文规则.这一切都可能复杂一个主体有执行代码的权限,但是却 ...
- Flask三种导入配置文件的方式
# 配置对象,里面定义需要给 APP 添加的一系列配置 class Config(object): DEBUG = True # 从配置对象中加载配置 app.config.from_object(C ...
- python - 条件语句/循环语句/迭代器
条件测试:if 条件表达式python 的比较操作 所有的python对象都支持比较操作 可用于测试相等性.相对大小等 如果是复合对象,pyt ...
- Spring boot中普通工具类不能使用@Value注入yml文件中的自定义参数的问题
在写一个工具类的时候,因为要用到yml中的自定义参数,使用@Value发现值不能正常注入,都显示为null: yml文件中的自定义格式 调用工具类的时候不能new的方式 要使用@Autowired的方 ...
- linux中创建python的虚拟环境
1,何为虚拟环境 linux是支持多用户的系统,如果某一位用户不想使用公用环境,想指定特殊的python版本安装仅供个人使用的一些包,那么虚拟环境将满足他的要求 2,虚拟环境使用需要virtualen ...
- linux中如何使用终端裁剪图片?
1,首先要安装支持图片裁剪的包: sudo apt-get install imagemagick 需要的话可以update一下, 2,在图片所在位置打开终端,我的我的截图叫screenshot.pn ...
- P4070 [SDOI2016]生成魔咒
题目地址:P4070 [SDOI2016]生成魔咒 相信看到题目之后很多人跟我的思路是一样的-- 肯定要用 SA(P3809 [模板]后缀排序) 肯定要会求本质不同的子串个数(P2408 不同子串个数 ...
- ARMV7-M数据手册---Part A :Application Level Architecture---A1 Introduction
1.前言 本章主要介绍了ARMV7体系结构及其定义的属性,以及本手册定义的ARMV7M属性. 主要包括: ARMV7体系结构和属性 ARMV7M属性 ARMV7M扩展 2. ARMV7体系结构和属性 ...