回顾
外键:关联关系(表与表之间,表中字段指向另外一张表的主键)
外键条件:字段类型必须一致,存储引擎必须为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合并算法。
文件备份以及还原
文件备份:存储引擎(myiasm适用)
单表数据备份:只能备份数据
SQL备份:备份的是SQL指令(mysqldump.exe客户端备份)
增量备份:备份系统日志文件
事务安全
事务transaction:一系列要发生的连续的操作。
事务安全:一种保护连续操作同时满足(实现)的一种机制。为了保证数据的完整性。
需求:有一张银行账户表,有A用户给B用户转账;A账户先减少,B账户增加,但是A操作完了之后断电了导致A减少了B没有增加。
-- 创建一个账户表
create table my_account(
number char(16) not null unique comment '账户',
name varchar(20) not null,
money decimal(10,2) default 0.0 comment '账户余额'
)charset utf8;
-- 插入数据
insert into my_account values
('0000000000000001','张三',1000),
('0000000000000002','李四',2000);
事务操作:
事务操作分为两种:自动事务(默认的)和手动事务
手动事务:
1.开启事务:告诉系统以下所有的操作(写)不要直接写入到数据表,先存放到事务日志
start transaction;
2.进行事务操作:一系列操作
a)李四账户减少
-- 事务操作:李四账户减少
update my_account set money = money - 1000 where id = 2;
b)张三账户增加
3.关闭事务:选择性的将日志文件中操作的结果保存到数据表(同步),或者直接清空事务日志(原来操作全部清空)
a)提交事务:同步数据表(操作成功):commit
b)回滚事务:直接清空日志表(操作失败):rollback
-- 提交事务
commit;
事务原理:
事务操作原理:事务开启之后,所有的操作都会临时保存到事务日志中,事务日志只有在得到commit命令才会同步到数据表,
其他任何情况都会清空(rollback,断电,突然断开等)
事务的回滚点
回滚点:在某一个成功的操作完成之后,后续的操作有可能成功有可能失败,但是不管成功还是失败,前面的操作都已经成功,
可以在当前位置设置一个回滚点,可以供后续失败操作返回到该位置而不是返回所有操作,这个点称为回滚点。
设置回滚点语法:savepoint 回滚点名字;
-- 回滚点操作开启事务
start transaction;
-- 事务处理1:张三加钱
update my_account set money = money + 10000 where id = 1;
-- 查看结果
select * from my_account;
-- 设置回滚点
savepoint sp1;
-- 查看结果
select * from my_account;
回到回滚点语法:rollback to 回滚点名字;
-- 银行扣税
update my_account set money = money - 10000* 0.05 where id = 2; -- 错误
select * from my_account;
-- 回滚到回滚点
rollback to sp1;
select * from my_account;
-- 继续操作
update my_account set money = money - 10000* 0.05 where id = 1;
-- 查看结果
select * from my_account;
-- 提交数据改变数据表
commit;
自动事务处理:
在mysql中默认的都是自动事务处理,用户操作完成后会立即同步到数据表中
自动事务:系统通过autocommit变量控制
show variables like 'autocommit';
关闭自动提交:set autocommit = off/0;
-- 关闭事务自动提交
set autocommit = 0;
show variables like 'autocommit';
再次直接写操作
自动关闭之后需要手动来选择处理:commit 提交,rollback 回滚。
注意:通常会使用自动事务,不可能在使用数据库的时候每次都提交会造成很多麻烦
事务特性:
事务有四大特性:ACID
A:atomic原子性,事务的整个操作是一个整体,不可分割要不全部成功要不全部失败。
C:consistency,一致性,事务操作的前后,数据表中的数据没有变化。
I:isolation,隔离性,事务操作是相互隔离,不受影响
D:durability,持久性,数据一旦提交不可改变
锁机制:Innodb默认是行锁,但是如果在事务操作的过程中没有使用到索引,那么系统会自动全表检索数据,自动升级为表锁。
行锁:只有当前行被锁住别的用户不能操作
表锁:整张表被锁住,别的用户不能操作
等待解锁使用commit或者rollback来进行释放
变量:
变量分为两种:系统变量和自定义变量
系统变量
系统定义好的变量:大部分的时候用户根本不需要使用系统变量:系统变量是用来控制服务器的变现的。
如:autocommit,auto_increment——increment等。
查看系统变量:show variables; -- 查看所有系统变量
查看具体变量值:任何一个有数据返回的内容都是由select查看
select @@变量名;
修改系统变量
修改系统变量分为两种方式:会话级别和全局级别
会话级别:临时修改,当前客户端当次连接有效
set 变量名 = 值;
set autocommit = 0;或者set @@autocommit = 0;
全局级别:
一次修改永久有效,对所有客户端有效。一般不会修改
set global autocommit = 0;
自定义变量
定义变量:为了区分系统变量,规定用户自定义变量必须使用一个@符号
set @变量名 = 值;
查看依旧使用select
select @变量名;
在MySQL中,“=”会默认的当做比较符号处理(很多地方),mysql为了区分比较和赋值的概念重新定义了一个新的赋值符号:
:=(冒号+等于号)
mysql允许从数据表中获取数据然后赋值给变量两种方式:
方案一:边赋值边查看结果
select @变量名 := 字段名 from 数据源; -- 从字段中取值赋值给变量名,如果使用=会变成比较的意思
select * from my_student;
-- 从表中获取数据赋值给变量,使用=号
select @name = name,name from my_student;
-- 从表中获取数据赋值给变量,使用:=号
select @name := name,name from my_student;
方案2:只有赋值不看结果,要求很严格,数据记录最多只获取一条:mysql不支持数组
select 字段列表 from 表名 into 变量列表;
所有自定义变量都是会话级别,当前客户端当次连接有效
所有自定义变量不区分数据库由用户决定: