外键约束
概念:
对外键列的值进行限定,让它和另一张表的主键产生关联关系。如果外键列有值,只能是另一张表中主键列的值。从而保证数据的有效性、完整性
语法:
①创建表时添加外键约束
create table tabname(
...
...
constraint 外键名 foreign key(从表中外键列的列名) references 主表的表名(主表中主键列的列名);
);
②删除外键
alter table 表名 drop foreign key 外键名
③表已经存在的情况下添加外键约束
alter table 表名 add constraint 外键名 foreign key(从表中外键列的列名) references 主表的表名(主表中主键列的列名);
多表关系
一对一
建表原则:唯一外键
一对多
建表原则:在多的一方添加一列,作为外键,关联一的一方的主键
多对多
建表原则:需要创建一张中间表,这张表至少包含两个字段,分别作为外键关联多对多双方的主键
多表查询的分类
内连接查询inner join
显式内连接
select * from 表1 [inner] join 表2 on 关联条件
隐式内连接
select * from 表1 , 表2 where 关联条件
内连接查询结果
查询的是多张表满足关联条件的数据
外连接查询outter join
左外连接
select * from 表1 left [outer] join 表2 on 关联条件
查询的结果:是左表的全部数据以及右表中满足关联条件的数据
右外连接
select * from 表1 right [outer] join 表2 on 关联条件
查询的结果:是右表的全部数据以及左表中满足关联条件的数据
子查询
概念:查询语句中嵌套其它查询语句,被嵌套的查询语句称之为子查询
根据子查询结果的不同,有不同的使用方式
1. 结果是单行单列的
对查询结果进行单值判断。 >,<,=,>=,<=
2. 结果是多行单列的
结合in或者not in
3. 结果是多行多列的
可以将查询结果当前表来使用,所以必须给它起别名
自关联查询
一张表中的多个列之间有逻辑上的关联关系,此时需要将一张表当成多张表来使用。
给一张表起不同的别名
备份和还原
1. 备份
mysqldump -uroot -p 要备份的数据库的名称>备份文件的路径
2. 还原
a,登陆到mysql数据库
b,删除原数据库(演示需要)
c,创建一个同名的数据库
d,使用数据库
e,使用命令来导入备份文件
source 备份文件的路径
事务
一个包含一条或者多条sql的执行单元,要么同时成功,要么同时失败
管理事务需要三个操作
1. 开启事务
start transaction;
2. 提交事务
commit;
3. 回滚事务
rollback;
事务开启到结束前,对数据库的修改只是临时的修改,提交之后才会真正的影响数据库中的数据。
回滚之后,数据会恢复到开启事务之前的状态。
mysql的事务提交机制
如果没有手动开启事务,事务是自动提交的
执行每一条DML语句,只要语句没有出现错误,都会自动提交事务
查询提交机制
select @@autocommit;
修改提交机制
set @@autocommit=0; -- 手动提交
try{
开启事务
执行sql1
执行sql2
....
commit;
}catch(Exception e){
rollback;
}
事务的四大特性
1. 原子性
强调的是事务的不可分割。要么同时成功,要么同时失败。
2. 一致性
强调的事务的执行前后从一个一致性状态切换到另外的一致性的状态。
3. 隔离性
强调的是一个事务的执行不应该受到其它事务的干扰。
4. 持久性
事务结束后对数据库的影响是持久性
不考虑事务的隔离性,会带来一些安全问题
有哪些问题?
1. 脏读
一个事务中读取到了另一个事务还没有提交的数据
2. 不可重复读
在一个事务中读取到了另一个事务已经提交的update的数据,造成在一次事务中多次查询结果不一致。
3. 幻读
没有读取到另一个事务已经提交的insert的数据
有哪些隔离级别
1. read uncommitted
读未提交
2. read committed
读已提交 oracle
3. repeatable read
可重复读 mysql
4. serializable
串行化