mariadb 视图 事务 索引 外键

视图
对于复杂的查询,在多个地方被使用,如果需求发生了改变,需要更改sql语句,则需要在多个地方进行修改,维护起来非常麻烦
 
假如因为某种需求,需要将user拆房表usera和表userb,该两张表的结构如下:
          测试表:usera有id,name,age字段
          测试表:userb有id,name,sex字段
       这时如果php端使用sql语句:select * from user;那就会提示该表不存在,这时该如何解决呢。解决方案:创建视图。以下sql语句创建视图:
          ucreate view ser as select a.name,a.age,b.sex from usera as a, userb as b where a.name=b.name;
视图本质就是对查询的封装
定义视图,建议以v_开头
 create view 视图名称 as select语句;
查看视图:查看表会将所有的视图也列出来
    show tables;
删除视图
    drop view 视图名称;
    例:
    drop view v_stu_score_course;
使用:视图的用途就是查询
    select * from v_stu_score_course;
 
例:
学生表
 
 
班级表
 
create view v_students_info as select classes.c_name, students.* from students inner join classes on students.cls_id=classes.id;
    -- 一般以"v_"开头的表就是视图,这个表 as  students表和classes表的连接
    -- 更改视图表中的数据,就相当于更改原表中主数据
> update v_students_info set name='六六六' where id=2;
 
create view v_student_info as select classes.c_name as '班级', students.name as '学生' from students inner join classes on students.cls_id=classes.id order by classes.id;
 
 
事务

事务是必须满足4个条件(ACID):四大特征

1 原子性(Autmic)

事务在执行时,要做到“要么不做,要么全做!”,就是说不允许事务只执行其中一部分。
即使因为故障而使事务不能完成,在rollback时也要消除对数据库的影响。

2 一致性(Consistency)

事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
在事务开始之前和结束之后,数据库的完整性约束没有被破坏

3 隔离性(Isolation)

一个事务的执行不能被其他事务干扰。
即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰,这些通过锁来实现。

4 持久性(Durability)

指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
接下来的其他操作或故障(比如说宕机等)不应该对其有任何影响。

事务的ACID特性可以确保银行不会弄丢你的钱。而在应用逻辑中,要实现这点非常难,甚至可以说是不可能完成的任务。

 
事务广泛的运用于订单系统、银行系统等多种场景
例如:A用户和B用户是银行的储户,现在A要给B转账500元,那么需要做以下几件事:
检查A的账户余额>500元;
A 账户中扣除500元;
B 账户中增加500元;
正常的流程走下来,A账户扣了500,B账户加了500,皆大欢喜。那如果A账户扣了钱之后,系统出故障了呢?A白白损失了500,而B也没有收到本该属于他的500。以上的案例中,隐藏着一个前提条件:A扣钱和B加钱,要么同时成功,要么同时失败。事务的需求就在于此
所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。例如,银行转帐工作:从一个帐号扣款并使另一个帐号增款,这两个操作要么都执行,要么都不执行。所以,应该把他们看成一个事务。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性
事务命令
要求:表的引擎类型必须是innodb类型才可以使用事务,这是mysql表的默认引擎
查看表的创建语句,可以看到engine=innodb
show create table students;
修改数据的命令会触发事务,包括insert、update、delete
开启事务,命令如下:begin;
开启事务后执行修改命令,变更会维护到本地缓存中,而不维护到物理表中
 
提交事务,命令如下: commit;
将缓存中的数据变更维护到物理表中
 
回滚事务,命令如下:d'pfgkjopdfjgpodf
jpoeripotweipoti034-8950934uiljlg.,afnm.s,d,m;lfasl'变更的数据
rollback;
 
数据库中默认不开启事物,但是默认是提交的
查看方式如下图命令:红色区域代表默认自动提交开启
 可直接用 SET AUTOCOMMIT 来改变mysql的自动提交模式
SET AUTOCOMMIT = {0 | 1}
 
索引
 
思考:在图书馆中是如何找到一本书的?
一般的应用系统对比数据库的读写比例在10:1左右,而且插入操作和更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重
当数据库中数据量很大时,查找数据会变得很慢
优化方案:索引,最基本的索引,不具备唯一性,仅加快查询速度
 
语法
查看索引
show index from 表名;
 
set profiging=1 -- 开启(执行)时间的记录
show profiles;    --查看提取用时
创建索引
 
方式一:建表时创建索引
 
create table create_index(
id int primary key,
name varchar(10) unique,
age int,
key (age)
);
 
方式二:对于已经存在的表,添加索引
 
如果指定字段是字符串,需要指定长度,建议长度与定义字段时的长度一致
字段类型如果不是字符串,可以不填写长度部分
 
create index 索引名称 on 表名(字段名称(长度))
例:
create index age_index on create_index(age);
 
删除索引:
 
drop index 索引名称 on 表名;
 
 
外键foreign key
如果一个实体的某个字段指向另一个实体的主键,就称为外键。被指向的实体,称之为主实体(主表),也叫父实体(父表)。负责指向的实体,称之为从实体(从表),也叫子实体(子表)
对关系字段进行约束,当为从表中的关系字段填写值时,会到关联的主表中查询此值是否存在,如果存在则填写成功,如果不存在则填写失败并报错
语法
查看外键
show create table 表名
添加外键
alter table students add constraint fk_students_gid foreign key (gid) references grade(gid) on delete cascade;
删除外键
 
show create table 表名
 alter table students drop foreign key 外键名字;

猜你喜欢

转载自www.cnblogs.com/liketimes/p/9954209.html