数据库的视图、事务、索引、外键

视图

将内关联或自关联的表创建成另一个表

(select * from students as a inner join classes as b on a.cls_id=b.id)
>create view v_students as (select...);

视图本质就是对查询的封装
定义视图,建议以v_开头

>create view 视图名称 as select语句;

查看视图:查看表会将所有的视图也列出来

>show tables;

删除视图

>drop view 视图名称;
例:
>drop view v_stu_score_course;

使用:视图的用途就是查询

>select * from v_stu_score_course;

事务

事务具有ACID特性:
原子性(A,atomicity)、
一致性(C,consistency)、
隔离性(I,isolation)、
持久性(D,durabulity)。

原子性:事务内的所有操作要么都执行,要么都不执行,它是一个不可分割的工作单位。

一致性:数据库总是从一个一致性的状态转换到另一个一致性的状态。

隔离性:一个事物所做的修改在最终提交之前,对其他事物是不可见的。

持久性:事务完成后,该事务内涉及的数据必须持久性的写入磁盘保证其持久性。当然,这是从事务的角度来考虑的的持久性,从操作系统故障或硬件故障来说,这是不一定的。

一个事务不可分割

事务命令

要求:表的引擎类型必须是innodb类型才可以使用事务,这是mysql表的默认引擎
查看表的创建语句,可以看到engine=innodb

>show create table pikachu;

修改数据的命令会触发事务,包括insert、update、delete

开启事务,命令如下:
开启事务后执行修改命令,变更会维护到本地缓存中,而不维护到物理表中

>begin;

提交事务,命令如下
将缓存中的数据变更维护到物理表中

>commit;

回滚事务,命令如下:
放弃缓存中变更的数据

>rollback;

索引

当数据库中数据量很大时,查找数据会变得很慢
优化方案:索引

索引并不是越多越好,索引太多时,会对增删改造成拖累

语法

查看索引

>show index from 表名;

创建索引

方式一:建表时创建索引

>create table pikachu(id int primary key,name varchar(10) unique,age int,key (age));

方式二:对于已经存在的表,添加索引

如果指定字段是字符串,需要指定长度,建议长度与定义字段时的长度一致
字段类型如果不是字符串,可以不填写长度部分

>create index 索引名称 on 表名(字段名称(长度))

例:

>create index age_index on pikachu(age);

删除索引:

>drop index 索引名称 on 表名;
>drop index age_index on pikachu;

测试时间

>set profiling=1;
#打开sql语句执行时间
建议不开,占资源
>show profiles;#查看sql执行时间

外键

如果一个实体的某个字段指向另一个实体的主键,就称为外键。被指向的实体,称之为主实体(主表),也叫父实体(父表)。负责指向的实体,称之为从实体(从表),也叫子实体(子表)

对关系字段进行约束,当为从表中的关系字段填写值时,会到关联的主表中查询此值是否存在,如果存在则填写成功,如果不存在则填写失败并报错

语法

查看外键

>show create table pikachu;

添加外键
数据库的视图、事务、索引、外键

>alter table pikachu constraint fk foreign key (cls_is) references pikahcu2(id) on delete cascade;
on delete cascade删除主表的同时删除子表,无法只删除子表

删除外键

>show create table pikachu;
>alter table table-name drop foreign key 外键名;

>alter table pikachu drop foreign key fk;
;