Mysql学习06

Mysql 学习 06

回顾:

外键: 关联关系 (表与表之间: 表中字段指向另外一张表的主键)
外键条件: 字段类型必须一致, 存储引擎必须为 innodb
外键约束:
子表约束: 不能插入父表不存在的记录
父表约束: 三种约束方式: (district, cascade, set null), on delete set null, on update cascade.

联合查询: union, 多表合并 和 单表不同查询条件.
联合查询使用: order by : select 语句必须使用括号, 还必须配合 limit.

子查询: 查询语句中有查询语句
分类: 按位置(from, where, 和 exists), 按返回值结果(用途): 标量, 列, 行 和 表.

视图: view
节省sql 语句; 安全性控制
视图本质: 虚拟表, 有结构,无数据.
视图数据操作: 多表只能改, 单表可增删改(增删有条件限制).
视图算法: undefined未定义, temptable 临时表 和 merge 合并算法.

文件备份与还原
文件备份: 存储引擎(myisam使用).
单表数据备份: 只能备份数据
SQL备份: 备份的是SQL指令 (mysqldump.exe 客户端备份)
增量备份: 备份系统日志文件.

需求: 有一张银行账户表: 有A 用户给B 用户转账: A账户先减少, B账户增加, 但是A操作完之后断电了.

解决方案: A减少钱,但是不要立即修改数据表, B收到钱之后,同时修改数据表.

事务安全:

事务: transaction:一系列要发生的连续的操作,
事务安全: 一种保护连续操作同时满足(实现的一种机制).

事务安全的意义: 保证数据操作的完整性.

事务的操作:
事务操作知识针对数据操作.
事务操作分为两种: 自动操作(默认的), 手动事务.

手动事务: 操作流程

1.开启事务: 告诉系统以下所有的操作(写)不要直接写入到数据表,先存入到事务日志,
Start transaction;
在这里插入图片描述

2.进行事务操作: 一系列联系的操作加
a)李四账户减少
b)张三账户增
在这里插入图片描述

3.关闭事务: 选择性的将日志文件中的操作结果保存到数据表,(同步)或者说直接清空事务日志(原来的操作全部清空)
1>提交事务: 同步数据表(操作成功) : commit
在这里插入图片描述
2>回滚事务: 直接清空日志表(操作失败) : rollback;

事务原理:

事务原理: 事务开启之后,所有的操作都会保存到事务日志, 事务日志只有在得到 commit 命令才会同步到数据表, 其他任何情况都会清空 (rollback, 断电, 断开连接).
在这里插入图片描述

回滚点:

回滚点: 在某个成功的操作完成之后, 后续的操作有可能成功,有可能失败, 但是不管成功还是失败, 前面的操作都已经成功, 可以在前面成功的位置, 设置一个点: 可以供后续失败操作返回到该位置, 而不是返回所有操作, 这个点称之为回滚点.

设置回滚点语法: savepoint 回滚点名字;
在这里插入图片描述
回到回滚点语法: rollback to 回滚点名字;
在这里插入图片描述

自动事务处理:

在mysql中: 默认的都是自动事务处理, 用户操作完会立即同步到数据表中.

自动事务: 系统通过autocommit 变量控制
Show variables like ‘autocommit’;

在这里插入图片描述
关闭自动提交: set autocommit = off/0; – off 或者 0;
在这里插入图片描述

再次直接写操作:
在这里插入图片描述

自动关闭之后, 需要手动来选择处理: commit 提交, rollback 回滚.
在这里插入图片描述
自动关闭之后, 需要手动来选择处理: commit 提交, rollback 回滚.
在这里插入图片描述

注意: 通常我们都会使用 自动事务.

事务特性:

事务有四大特性: ACID
A: Atomic 原子性: 事务的整个操作是一个整体, 不可分割, 要么全部成功,要么全部失败;
C: consistency, 一致性, 事务操作前后,数据表中的数据没有变化.
I: isolation: 隔离性: 事务操作是相互隔离不受影响.
D: durability: 持久性: 数据一旦提交,不可改变, 永久的改变数据表数据.

锁机制: innodb 默认是行锁, 但是如果在事务操作的过程中,没有使用到索引,系统会自动全表检索数据, 自动升级为表锁.
行锁: 只有当前行被锁住, 别的用户不能操作.
表锁: 整张表都被锁住, 别的用户都不能操作.

在这里插入图片描述

变量: (SQL编程相关)

变量分为两种: 系统变量 和 自定义变量
系统变量:
系统定义好的变量: 大部分的时候根本不需要使用系统变量: 系统变量是用来控制服务器的表现的: 如: autocommit, auto_increment_increment, 等.

查看系统变量:
Show variables; – 查看所有系统变量 (大约300多个).

查看具体变量值: 任何一个有数据返回的内容都是由 select 查看.
Select @@变量名;
在这里插入图片描述

修改系统变量:

修改系统变量分为两种方式: 会话级别 和 全局级别.

会话级别: 临时修改, 当前客户端当次连接有效
Set 变量名 = 值; / Set @@变量名 = 值;

全局修改: 一次修改,永久生效 (对所有客户端都生效).
Set global 变量名 = 值;

如果对方 (其他) 客户端当前已经连上服务器,那么修改无效,重新退出登录才有效.

自定义变量:

自定义变量: 用户自己定义的变量

定义变量:

在mysql中: 系统为了区分系统变量, 规定用户自定义变量必须使用一个 @ 符号
Set @变量名 = 值;
在这里插入图片描述
自定义四变量也是类似系统变量查看
Select @变量名;
在这里插入图片描述

在mysql系统中, “=” 会默认的当做比较符号处理(很多地方), mysql中为了区分比较 和 赋值的概念: 重新定义了一个新的符号: := 冒号+等号
在这里插入图片描述

Mysql 允许从数据表中获取数据,然后赋值给变量: 两种方式

方案1: 边赋值, 边查看结果.
Select @变量名 := 字段名 from 数据源; - 从字段中取值赋值给变量名; 如果使用 = 号会变成比较.
在这里插入图片描述
方案2: 只有赋值不看结果: 要求很严格: 数据记录最多只允许获取一条: mysql不支持数组.
Select 字段列表 from 表名 into 变量列表;
在这里插入图片描述

所有自定义的变量都是会话级别: 当前客户端当次连接有效.
所有自定义变量属于用户级别,不区分数据库.

需求: 有两张表, 一张订单表,一张商品表, 每生成一个订单,意味着商品的库存要减少.

触发器:

触发器: trigger, 事先为某张表绑定一段代码, 当表中的某些内容发生改变的时候(增删改),系统会自动触发代码执行.

触发器: 事件类型, 触发时间, 触发对象
1.事件类型: 增 删 改, 三种类型 insert, delete 和 update;
2.触发时间: 前后: before 和 after
3.触发对象: 表中的每一条记录(针对行)

一张表中只能拥有一种触发时间的一种触发类型的触发器(即: 同种时间又同种类型的只能有一个): 最多一张表能有 6 个触发器.

创建触发器:

在mysql高级结构中: 没有大括号, 都是用对应的字符符号来代替

触发器基本语法:

–临时修改语句结束符
Delimiter 自定义符号: 后续代码中只有碰到自定义符号才算结束.
Create trigger 触发器名字 触发时间 事件类型 on 触发对象(表名) for each row
Begin – 代表左大括号: 开始
–这其中就是触发器的内容: 每行内容都必须使用语句结束符: 分号 ;

End: – 代表结束: 结束
-语句结束符
–自定义符号

–将临时修改修正过来
Delimiter ;
在这里插入图片描述

查看触发器:

查看所有触发器 或者 模糊匹配
Show triggers [like ‘pattern’];
在这里插入图片描述

可以查看触发器创建语句.
Show create trigger 触发器名字;
在这里插入图片描述
所有的触发器都会保存到一张表中: information_schema.triggers;
在这里插入图片描述

使用触发器:

触发器: 不需要手动调用, 而是当某种情况发生时会自动触发.(订单里面插入数据之后).
在这里插入图片描述

修改触发器 & 删除触发器:

触发器不能修改,只能先删除,后新增.
Drop trigger 触发器名字;

触发器记录:

触发器记录: 不管触发器是否触发了, 只要当某种操作准备执行, 系统就会将当前要操作的记录的当前状态 和 即将执行之后的新的状态给 分别保留下来, 供触发器使用: 其中, 要操作的当前状态保存到 old 中, 操作之后的可能形态保存到 new 中.

Old: 代表的是旧记录, New 代表的是新纪录.
删除的时候是没有new 的; 插入的时候是没有 old 的.

Old 和 New 都是代表记录本身: 任何一条记录除了有数据, 还有字段名字.
使用方式: old.字段名 / new.字段名 (new 代表的是假设发生之后的结果) (注意: old 点 字段名 中间有有一个 小数点).

在这里插入图片描述
查看触发器效果:
在这里插入图片描述

SQL编程中的代码执行结构:

代码执行结构有三种: 顺序结构, 分支结构 和 循环结构.

分支结构:
分支结构: 实现准备多个代码块儿, 按照条件选择性执行某段代码.

在mysql中只有 if 分支

基本语法:
If 条件判断 then
–满足条件要执行的代码
Else
–不满足条件要执行的代码
End if;

猜你喜欢

转载自blog.csdn.net/yangyang_A/article/details/82828748
今日推荐