六天玩转Mysql(第五天)

第五天

外键

1、增加外键

外键可以在创建表的时候或者创建表之后增加(但是要考虑数据的问题)

创建表的时候增加外键:在所有的表字段之后,使用foreign key(外键字段) references 外部表(主键字段)

create table my_foreignl(
    id int primary key auto_increment,
    name varchar(20) not null comment '学生姓名',
    --增加外键
    foreign key(c_id) references my_class(id)
)charset utf8;

在新增表之后增加外键:修改表结构

alter table 表名 add[constraint 外键名字] foreign key(外键字段) references 父表(主键字段)

--增加外键
alter table my_foreign2 add
--指定外键名
constraint student_class_1
--指定外键字段
foreign key(c_id)
--引用父表主键
references my_class(id);

 

2、删除外键

外键不可修改:只能先删除后新增

删除外键语法

//一张表中可以有多个外键,但是名字不能相同

alter table 表名 drop foreign key 外键名;

六天玩转Mysql(第五天)_第1张图片

 

3、对外键的约束

对子表约束:子表数据进行写操作(增、改)的时候,如果对应的外键字段在父表找不到对应的匹配,那么操作就会失败(约束子表数据操作)

对父表约束:父表数据进行写操作(删、改:都必须涉及到主键本身),如果对应的主键在子表中已经被数据所引用,那么就不允许操作

六天玩转Mysql(第五天)_第2张图片

 

4、外键的条件

1、外键要存在:首先必须保证表的存储引擎是innodb(默认的存储引擎),如果不是innodb存储引擎,那么外键就可以创建成功,但是没有约束效果

2、外键字段的字段类型(列类型)必须与父表的主键类型完全一致

3、一张表中的外键名字不能重复

4、增加外键的字段(数据已经存在)必须保证数据与父表主键要求对应

 

联合查询

select 语句1

union [union 选项]

select 语句2...

六天玩转Mysql(第五天)_第3张图片

 

1、联合查询中order by的使用

在联合查询中,order by不能直接使用,需要对查询语句使用括号才行。

若要使order by生效,必须搭配limit使用

六天玩转Mysql(第五天)_第4张图片

 

2、Exists子查询

Exists:是否存在的意思,exists子查询就是用来判断某些条件是否满足,exists是接在where之后,exists的返回值只有0和1

六天玩转Mysql(第五天)_第5张图片

select * from my_student where exists(select * from my_class);

 

视图

是一种有结构(有行有列),但是没有结果(结构中不真实存放数据)的虚拟表,虚拟表的结构来源不是自己定义,而是从对应的基表中产生(视图的数据来源)

1、创建视图

基本语法:

create view 视图名字 as select 语句;

这里的select语句可以是连接查询、联合查询、子查询

六天玩转Mysql(第五天)_第6张图片

视图一旦创建,系统会在视图对应的数据库文件夹下创建一个对应的结构文件:.frm文件

 

2、修改视图

--修改视图
alter view my_vl as select id,name,age,sex,height,c_id from my_student;
--删除视图
drop view my_v4;

 

3、视图的意义

1、视图可以节省SQL语句,将一条复杂的查询语句使用视图进行保存,以后可以直接对视图进行操作

2、数据安全:视图操作是主要针对查询的,如果对视图结构进行处理(删除),不会影响基表数据(相对安全)

3、视图往往是在大项目中使用,而且是多系统使用,可以对外提供有用的数据,但是影响关键(无用)的数据,数据安全

4、视图可以对外提供友好型,不同的视图提供不同的数据,对外好像专门设计

5、视图可以更好的进行权限控制

 

4、新增数据

就是直接对视图进行数据新增

4.1 多表视图不能新增数据

4.2 可以向单表视图插入数据:但是视图中包含的字段必须有基表中所有不能为空(或者没有默认值)字段

六天玩转Mysql(第五天)_第7张图片

4.3 视图是可以向基表插入数据的

六天玩转Mysql(第五天)_第8张图片

 

5、删除视图

多表视图不能删除数据,单表可以

六天玩转Mysql(第五天)_第9张图片

六天玩转Mysql(第五天)_第10张图片

 

6、更新数据

理论上来说不论单表视图还是多表视图都可以进行更新数据

六天玩转Mysql(第五天)_第11张图片

更新限制:with check option,如果对视图在新增的时候,限定了某个字段有限制,那么对视图进行数据更新操作时,系统会进行验证,要保证更新之后,数据依然可以被实体查询出来,否则不让更新。

六天玩转Mysql(第五天)_第12张图片

 

7、视图算法

视图算法是系统对视图以及外部查询视图的select语句的一种解析方式

视图算法分为三种

1、undefined:未定义(默认),这不是一种实际使用算法,是一种推卸责任的算法,告诉系统,视图没有定义算法,系统自己看着办。

2、temptable:临时表算法,系统应该先执行视图的select语句,后执行外部查询语句

3、merge:合并算法,系统应该先将视图对应的select语句与外部查询视图的select语句进行合并,然后执行(效率高,常态)

算法指定:在创建视图的时候

create algorithm = 指定算法 view 视图名字 as select 语句;

六天玩转Mysql(第五天)_第13张图片

--指定算法为临时表
create algorithm = temptable view my_v6 as select * from my_student order by height dsc;

六天玩转Mysql(第五天)_第14张图片

 

数据备份和还原

备份:将当前已有的数据或者记录保留

还原:将已经保留的数据恢复到对应的表中

 

为什么要做备份还原?

1、防止数据丢失、被盗、误操作

2、保护数据记录

 

数据备份还原的方式有很多种:数据表备份、单表数据备份、SQL备份、增量备份

 

数据表备份

不需要通过SQL来备份,直接进入到数据库文件夹复制对应的表结构以及数据文件,以后还原的时候,直接将备份的内容放进去即可。

数据表备份有前提条件:根据不同的存储引擎有不同的区别:

存储引擎:mysql进行数据存储的方式,主要有两种:innodb和myisam

六天玩转Mysql(第五天)_第15张图片

六天玩转Mysql(第五天)_第16张图片

对比myisam和innodb数据存储方式

innodb只有表结构,数据全部存储到ibdata1文件中

myisam表,数据和索引全部单独分开存储

六天玩转Mysql(第五天)_第17张图片

这种文件备份通常适用于myisam存储引擎,直接复制三个文件即可,然后直接放到对应的数据库下即可使用。

六天玩转Mysql(第五天)_第18张图片

 

1、单表数据备份

备份:从表中选出一部分数据保存到外部的文件中

select */字段列表 into outfile 文件所在路径 from 数据源;--前提是外部文件不存在

六天玩转Mysql(第五天)_第19张图片

高级备份:自己制定字段和行的处理方式

select */字段列表 into outfile 文件所在路径 fields 字段处理 lines 行处理 from 数据源;

fields:字段处理

     enclosed by:字段使用什么内容包裹,默认是'',空字符串

     teminated by:字段以什么结束,默认是'\t',tab键

     escaped by:特殊符号用什么方式处理,默认是'\\',使用反斜杠转义

lines:行处理

     starting by:每行以什么开始,默认是'',空字符串

     teminated by:每行以什么结束,默认是'\r\n',换行符

--指定备份处理方式
select * into outfile 'D:/server/temp/class1.txt'
--字段处理
fields
enclosed by '""' --数据使用双引号包裹
terminated by '|' --使用竖线分割字段数据
--行处理
lines
staring by 'START:'
from my_class;

六天玩转Mysql(第五天)_第20张图片

 

数据还原:将一个在外部保存的数据重新恢复到表中(如果表结构不存在,那么sorry)

Load data infile 文件路径 into table 表名[(字段列表)] fields 字段处理 lines 行处理,怎么备份怎么还原

--还原数据
load data infile 'D:/server/temp/class1.txt'
into table my_class
--字段处理
fields
enclosed by '""' --数据使用双引号包裹
terminated by '|' --使用竖线分割字段数据
--行处理
lines
staring by 'START:';

 

2、Sql备份

备份的是SQL语句:系统会对表结构以及数据进行处理,变成对应的SQL语句,然后进行备份,还原的时候只有执行SQL指令即可(主要就是针对表结构)

 

备份:MySQL没有提供备份指令,需要利用mysql提供的软件:mysqldump.exe

Mysqldump.exe也是一种客户端,需要操作服务器,必须连接认证

Mysqldump/mysqldump.exe -hPup 数据库名字 [数据表名字 1 [数据表名字2...]] > 外部文件目录(建议使用.sql)

 

3、单表备份

六天玩转Mysql(第五天)_第21张图片

 

4、整库备份

六天玩转Mysql(第五天)_第22张图片

六天玩转Mysql(第五天)_第23张图片

--还原数据:MySQL客户端还原
mysql -uroot -proot mydatabase < D:/server/temp/student.sql

 

 

方案2:使用SQL指令还原

source 备份文件所在路径;

--SQL指令还原SQL备份
source D:/server/temp/student.sql

 

5、增量备份

不是针对数据或者SQL指令进行备份,是针对MySQL服务器的日志文件进行备份

增量备份:指定时间段开始进行备份、备份数据不会重复、而且所有的操作都会备份(大项目都用增量备份)

六天玩转Mysql(第五天)_第24张图片

 

 

你可能感兴趣的:(数据库)