数据库约束
代码语言:txt复制约束的作用: 保证数据的完整性. 单表约束: 主键约束: primary key //一般后边还会写上auto_increment 唯一约束: unique 非空约束: not null* 多表约束: * 外键约束: foreign key多表的分析和设计
关系分类:
一对多的关系:
一个部门可以有多个员工, 一个员工只能属于某一个部门.
一个分类下有多个商品, 一个商品只能属于某一个分类.
一个用户产生多个订单, 一个订单只能属于某一个用户.
多对多的关系:
一个学生可以选择多门课程, 一个课程也可以被多个学生选择.
一个订单包含多个商品, 一个商品也可以在多个订单中.
一对一的关系:
一个公司只能对应一个注册地址, 一个注册地址只能对应一个公司.
多表建表原则
- 一对多的建表原则: * 在"多"的一方创建一个字段, 作为外键, 指向"一"的一方的主键.
- 多对多的建表原则: * 需要创建第三张表(中间表), 在中间表中至少需要有两个字段, 分别作为外键指向多对多双方的主键.
- 一对一的建表原则: * 唯一外键对应.
代码语言:txt复制多表查询连接查询 交叉连接: //了解 select * from A,B; //最终结果获取到的是两个表的笛卡尔积, 一般不用这种做法. 内连接:(inner join) 显示内连接: select * from A inner join B on 条件; 隐式内连接: select * from A,B where 条件; 外连接:(outer join) 左外连接: select * from A left outer join B on 条件; 右外连接: select * from A right outer join B on 条件; 内连接和外连接的区别: 内连接: 查到的是 两个表的交集. 左外连接: 左边表的全部 和 两个表的交集. 右外连接: 右边表的全部 和 两个表的交集.子查询 概述: 指的是一条语句的查询条件需要依赖另一条语句的查询结果. in: 只要满足其中一个就行. any: 只要比给定的所有值中的任意一个大(小)就行. all: 必须比给定的所有值都要大(小).
事务
概述:
事务指的是逻辑上的一组操作, 组成这组操作的各个逻辑单元要么全部都成功, 要么全失败.
//MySQL中默认情况下,一条语句是一个事务, 事务会自动提交.
//Oracle中默认事务是不提交的, 需要手动提交事务.
MySQL事务管理的命令:
start transaction; //开启事务
SQL语句1; //要执行的SQL语句
SQL语句2;
commit //提交事务
rollback; //回滚事务
show variables like '%commit%';
事务的特性:
1. 原子性.
强调事务的多个操作不可分割.
2. 一致性.
强调事务执行的前后, 数据完整性保持一致.
3. 隔离性
强调事务执行过程中, 不应该受到其他事务的干扰.
4. 持久性
强调事务一旦结束, 数据就持久到数据库中.
如果不考虑事务的隔离性, 有可能会引发一些安全性的问题.
读的方面:
脏读: 指的是一个事务读到另一个事务未提交的数据.
不可重复读: 指的是一个事务读到了另一个事务已经提交的 update的数据,
导致多次查询结果不一致.
虚读/幻读: 指的是一个事务读到了另一个事务已经提交的 insert的数据,
导致多次查询结果不一致.
写的方面: (了解就行, 不用重点掌握)
丢失更新.
解决事务的读问题:
设置事务的隔离级别:
read uncommitted: //未提交读
脏读, 不可重复读, 虚读都有可能发生.
read committed: //已提交数据库
避免脏读, 但是不可重复读和虚读是有可能发生的.
repeatable read: //可重复读
避免脏读, 不可重复读. 但是虚读是有可能发生的.
serializable: 串行化的
避免脏读, 不可重复读, 虚读
安全性:
read uncommitted < read committed < repeatable read< Serializable
效率:
read uncommitted > read committed > repeatable read > Serializable
一般数据库设置: read committed 和 repeatable read
MySQL默认: repeatable read
Oracle默认: read committed