CSIC_716_20191217【事务、视图、触发器、存储过程、索引】
事务:
事务保证对数据操作时的安全性,事务中的代码要么一起成功,要么一起失败。
事务以 start transaction 开始,中间可以写诸多个sql 语句对数据库进行操作, 以rollback(失败) 或者commit(成功)结束。
伪代码 try: ...sql语句 except 异常: rollback; else: commit;
事务的四大属性(ACID):
A:原子性(一个事务就是一个基本的执行单位,事务里的代码要么全部执行,要么全部不执行)
C:一致性 (执行的结果要么一起成功,要么一起失败。一致性与原子性性密切相关)
I:隔离性(事物之间是隔离的,并发执行的各个事务之间不能互相干扰(并发的时候每行数据难道不应该有锁吗?))
D:持久性(一个事务一旦提交,就产生永久性的结果)
数据库设计的三大范式:
第一范式(NF1):每个字段要有原子性,不可再分割
第二范式(NF2):每个字段与主键要有相关性。
第三范式(NF3):每个字段与主键要直接相关,而不是间接相关。
视图:视图在硬盘中只有表结构文件,没有数据文件。(较少使用)
语法: 创建:create view 视图名字 as sql语句
删除:drop view 视图名字
存储过程:通过存储过程,让不会sql语句的人能顺利操作数据库
存储过程在哪个库中创建,只能在那个库中使用。
语法:存储过程分为有参存储过程和无参存储过程
创建有参存储过程
delimiter //
create procedure p1(
in arg1 int, # in 是代表传入,不可传出
out agr2 varchar, # out 是代表可以传出
inout arg3 int # inout 代表既可以传入也可以传入
)
begin
select * from t1 where agr1 =1 or arg2 = '2'
set arg3 = 0
end //
delimiter ;
在mysql中调用
# 在mysql中调用
set @xx = 11 # 先初始化一个值,备用,一遍将来可以查询是否变化
call p1(1,'4',@xx) # 调用存储过程
select @xx # 查看结果,看sql语句是否已被执行
在python中调用
#在python中
import pymysql
coon = pymysql.connect(
user='',
passwd='',
host= '',
port=3306,
db='',
charset='',
autocommit=True
)
cursor = coon.cursor(pymysql.cursors.DictCursor)
cursor.callproc('p1',(1,'4',11)) # 此时,内部会产生变量用来接元组中的参数
#参数的规律为 @_p1_0=1,@_p2_1='4,@_p3_2=11
cursor.execute('select @_p1_2')
#为什么查@_p1_2呢,因为在存储过程中是通过第三个参数来反馈是否执行完成
创建无参存储过程
delimiter //
create procedure p1( )
begin
select * from t1 where agr1 =1 or arg2 = '2'
end //
delimiter ;
在mysql中调用
# 在mysql中调用 call p1( ) # 调用存储过程
在python中调用
#在python中
import pymysql
coon = pymysql.connect(
user='',
passwd='',
host= '',
port=3306,
db='',
charset='',
autocommit=True
)
cursor = coon.cursor(pymysql.cursors.DictCursor)
cursor.callproc('p1')
以下为事务结合存储过程的小例子:
delimiter //
create PROCEDURE p5(
OUT p_return_code tinyint
)
BEGIN
DECLARE exit handler for sqlexception
BEGIN
-- ERROR
set p_return_code = 1;
rollback;
END; DECLARE exit handler for sqlwarning
BEGIN
-- WARNING
set p_return_code = 2;
rollback;
END; START TRANSACTION;
update user set balance=900 where id =1;
update user123 set balance=1010 where id = 2;
update user set balance=1090 where id =3;
COMMIT; -- SUCCESS
set p_return_code = 0; #0代表执行成功 END //
delimiter ;
触发器trigger:
在对表增、删、改的前或后,自动触发的功能称为触发器。
语法:create trigger tri_before_insert_t1 before|after insert|update|delete on t1 for each row begin sql代码 end
注意,在写触发器的时候,因为中间插入的SQL代码最后有分号,会导致上述触发器语句在分号处中断,故需要通过一种特殊手段改变局部命令的结束符。
delimiter %% #声明后续语句以%%结束
create trigger tri_before_insert_t1 before|after insert|update|delete on t1 for each row begin sql代码 end %% # 这一条语句要用%%结束
delimiter ; #声明后续语句以 ; 结束
索引
索引是一种数据结构,索引可以加速数据的查询,类似于书的目录
primary key(聚集索引):加速查询、非空唯一
unique key(辅助索引):加速查询、唯一
index key(辅助索引) : 没有任何约束,只是加速查询
创建索引,会使得查询速度变快,但是,创建写的速度会变慢。
Innodb索引的原理
B+树、非聚簇索引叶子节点上存的是索引,聚簇索引叶子节点上存的数据
https://www.cnblogs.com/rjzheng/p/9915754.html
InnoDB索引原理
CSIC_716_20191217【事务、视图、触发器、存储过程、索引】的更多相关文章
- mysql事务,视图,触发器,存储过程与备份
.事务 通俗的说,事务指一组操作,要么都执行成功,要么都执行失败 思考: 我去银行给朋友汇款, 我卡上有1000元, 朋友卡上1000元, 我给朋友转账100元(无手续费), 如果,我的钱刚扣,而朋友 ...
- mysql 视图 触发器 存储过程 函数事务 索引
mysql 视图 触发器 存储过程 函数事务 索引 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当 ...
- MySQL 查询 存储过程 视图 触发器 函数 索引 建表语句 数据库版本 当前登录用户 当前数据库名称
MySQL 查询 存储过程 视图 触发器 函数 索引 建表语句 数据库版本 当前登录用户 当前数据库名称 INFORMATION_SCHEMA.TABLES INFORMATION_SCHEMA. ...
- day40 mycql 视图,触发器,存储过程,函数
视图,触发器,存储过程,自定义函数 -- 回顾 1.mysql 约束 1.非空 not null 2. 主键约束 primary key 3. 唯一约束 unique 4. 外键约束 foreign ...
- Mysql 视图,触发器,存储过程,函数,事务
视图 视图虚拟表,是一个我们真实查询结果表,我们希望将某次查询出来的结果作为单独的一个表,就叫视图,无法对图字段内容进行增删改. --格式: CREATE VIEW 视图名字 AS 操作; --比如: ...
- mysql视图、事务、触发器、索引
视图 什么是视图 ? 一个查询语句的结果是一张虚拟表,将这种虚拟表保存下来,它就变成了一个视图. 为什么要用视图? 当频繁需要用到多张表的连表结果,你就可以事先生成好视图,之后直接调用即可,避免了反复 ...
- SQL 视图 临时表 存储过程 索引 事务
视图: 视图是按照你的sql语句生成的一个虚拟的东西,本身并不占数据库的空间 创建视图 create view view_1 as select id from table_1 当你表里的数据增加或者 ...
- python操作MySQL,SQL注入的问题,SQL语句补充,视图触发器存储过程,事务,流程控制,函数
python操作MySQL 使用过程: 引用API模块 获取与数据库的连接 执行sql语句与存储过程 关闭数据库连接 由于能操作MySQL的模块是第三方模块,我们需要pip安装. pip3 insta ...
- MySQL 索引 视图 触发器 存储过程 函数
1.索引 索引相当于图书的目录,可以帮助用户快速的找到需要的内容. 数据库利用各种各样的快速定位技术,能够大大提高查询效率.特别是当数据量非常大,查询涉及多个表时,使用索引往往能使查询速度加快成千上万 ...
- Mysql学习---视图/触发器/存储过程/函数/执行计划/sql优化 180101
视图 视图: 视图是一个虚拟表(非真实存在),动态获取数据,仅仅能做查询操作 本质:[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用.由 ...
随机推荐
- Hibernate中Session的save()、update()、merge()、lock()、saveOrUpdate()和persist()方法有什么区别?
Hibernate的对象有三种状态:瞬态.持久态和游离态.游离状态的实例可以通过调用save().persist()或者saveOrUpdate()方法进行持久化:脱管状态的实例可以通过调用 upda ...
- js 在array的遍历操作中修改arry中元素数量 出现的一些奇特的操作
在js中array是属于复杂类型,在arr1=arr2得赋值操作中,arr1得到的值并不是arr2的value,而是一个指向引用.那么修改arr1的同时arr2读取的值也会同步变化,那么问题来了,上代 ...
- FTPClient TLS 与 FTP 进行数据传输异常:Remote host closed connection during handshake
环境:java JDK 1.8.org.apache.commons-net-3.6.jar.端口已放开 FTPClient ftpClient = new FTPClient(protocol, f ...
- 「NOI2016」网格 解题报告
「NOI2016」网格 容易注意到,答案最多为2,也就是说答案为-\(1,0,1,2\)四种,考虑逐个判断. 无解的情况比较简单 如果\(nm\le c+1\),显然无解 如果\(nm=c+2\),判 ...
- vue基础八
表单控件绑定 1.基础用法 你可以用 v-model 指令在表单控件元素上创建双向数据绑定.尽管有些神奇,但 v-model 本质上不过是语法糖,它负责监听用户的输入事件以更新数据,并特别处理一些极端 ...
- ELK Stack 7.1.1之集群搭建
一. 环境准备:3台Linux服务器,系统为CentOS 7.5 角色划分:3台机器全部安装jdk1.8,全部安装elasticsearch (后续都简称为es集群) 主节点上需要安装kibana与l ...
- 科学把妹法 ( ̄▽ ̄)"
曾经有一位生物学人士,公布了工科把妹第一弹,暨“巴甫洛夫把妹法”: 每天给你那位心仪的女同事/女同学的抽屉里都放上精心准备的早餐,并且保持缄默不语,无论她如何询问,都不要说话. 如此坚持一至两个月, ...
- Git GUI使用方法【转】
前言 之前一直想一篇这样的东西,因为最初接触时,我也认真看了廖雪峰的教程,但是似乎我觉得讲得有点多,而且还是会给我带来很多多余且重复的操作负担,所以我希望能压缩一下它在我工作中的成本,但是搜索了一下并 ...
- Least Common Ancestors
/* Least Common Ancestors * Au: Small_Ash */ #include <bits/stdc++.h> using namespace std; con ...
- scrapy原理
scarpy据说是目前最强大的爬虫框架,没有之一.就是这么自信. 官网都是这么说的. An open source and collaborative framework for extracting ...