mysql的级联操作CASADE
有了外键的关联,修改和删除比较麻烦,加入ON UPDATE CASADE和ON DELETE CASADE后当修改或者删除主表的数据,从表随之变化.
语法:
FOREIGN KEY (从表的关联字段名称)
REFERENCE 主表名称(主表关联的字段名称)
ON UPDATE CASADE
ON DELETE CASADE
通过sql 添加外键:
alter table 表名
add CONSTRAINT 外键名称 FOREIGN KEY 从表的某个id
REFERENCES
主表的某个字段(主键字段id)
级联修改
级联删除
多表关系:
一对一,多对一的关系 如一个人对应一个身份证
一对多的关系 如一个用户可以有多个订单
多对多的关系 如一个学生可以选择多门课程,一个课程也可以同时被多个学生选择
数据库的三大范式:
1NF:数据库表中的每一列不可在拆分的原子数据项,必须独立的列;
2NF:在1NF基础上,一张表,描述一件事,数据库表中非主键字段必须完全依赖于主键字段,完全依赖是指不能存在仅依赖主键一部分的列。
3NF:在2NF基础上,任何非主列不得传递依赖于主键。
多表查询:
分类:
1)内连接
隐式内连接---看不到join关键字,使用where条件
显示内连接---inner join 关键字
2)外连接
左外连接(推荐)
右外连接
3)子查询:select 语句嵌套select语句,
查询的效率比较低
常用where条件使用比较运算符
或者使用in集合语句
或者使用一条select语句的结果作为一个"虚表"和其他表查询
注意:
如果使用这种语法 select 字段列表 from 表名1,表名2;会出现"笛卡尔乘积",原因:两张表是有关联关系,A表的记录数 *B表的记录数 = 总记录数.
内连接之隐式内连接 :select 字段列表 from 表名名1,表名名2 where 连接条件 ;
显示内连接:inner join 关键字 inner可以省略
语法:select 字段列表 from 表名名1 inner join 表名名2 on 连接条件;
注:优先使用where
内连接查询时有一些关联值不相等的数据查找不到,可以使用左外和右外连接
左外连接:将左边表数据以及满足两种表条件的数据全部展示;
语法:select 字段列表 from 表名1 left outer join 表名2 on 连接条件 outer可以省略
数据库事务
事务:执行一系列操作的sql语句,要么同时执行成功,要么同时执行失败
①开启事务
start transaction;
② 执行业务操作
如果执行多个事务出现异常需要回滚到起始状态 rollback
③commit 提交事务
关系型数据库的特点:
原子性:使用事务管理的业务操作(执行多个sql),要么同时执行成功,要么同时失败
隔离性:业务和业务之间是独立,业务又需要被事务管理,事务和事务之间是独立的,相互之间不影响,分离开来!
持久性:针对增删改操作,只要提交事务,即使关机了,数据永久保存!
一致性:在事务管理的业务操作过程中,执行之前和执行之后它的数量总量不变
事务的隔离级别:
mysql的默认隔离级别就是 repeatable read ;
mysql5.1以上查询事务的隔离级别 SELECT @@tx_isolation ;
mysql8.0 查询事务隔离级别SELECT @@transaction_isolation ;
read uncommitted: 读未提交,会出现"脏读"问题,(一个事务可以读取另一个未提交事务的数据)
read committed: 解决了脏读问题,但会出现"不可重复读问题"(一个事务要等另一个事务提交后才能读取数据,在提交事务前和提交事务后读到的数据不一致)
repeatable read: 可重复读(mysql默认隔离级别) , 就是在开始读取数据(事务开启)时,不再允许修改操作 ,它解决了脏读和不可重复读会出现"幻读".
serializable : 序列化,或串行化,就是将每个事务按一定的顺序去执行,它将隔离问题全部解决, 级别最高,安全性最高,效率低!