1. 约束
- 概念:对表中的数据进行限定,保证数据的正确性、有效性和完整性
- 分类
- 非空约束:
not null
- 唯一约束:
unique
- 主键约束:
primary key
- 外键约束:
foreign key
- 非空约束:
- 非空约束:
not null
,限制某一列的值不能为null- 创建表时添加约束
CREATE TABLE stu( id INT, NAME VARCHAR(20) NOT NULL -- name不能为null ); 复制代码
- 创建表后添加约束:
ALTER TABLE stu MODIFY NAME VARCHAR(20) NOT NULL;
- 删除约束:
ALTER TABLE stu MODIFY NAME VARCHAR(20);
- 创建表时添加约束
- 唯一约束:
unique
,限制某一列的值不能重复- 受约束的列最多只能有一条记录为null
- 创建表时添加约束
CREATE TABLE stu( id INT, phone_number VARCHAR(20) UNIQUE -- 手机号 ); 复制代码
- 创建表后添加约束:
ALTER TABLE stu MODIFY phone_number VARCHAR(20) UNIQUE;
- 删除唯一约束:
ALTER TABLE stu DROP INDEX phone_number;
- 主键约束:
primary key
- 注意
- 主键非空且唯一
- 主键就是记录的唯一标识
- 一张表只能有一个字段为主键
- 创建表时添加约束
create table stu( id int primary key,-- 给id添加主键约束 name varchar(20) ); 复制代码
- 创建表后添加约束:
ALTER TABLE stu MODIFY id INT PRIMARY KEY;
- 删除主键约束
- (错误)
alter table stu modify id int;
- (正确)
ALTER TABLE stu DROP PRIMARY KEY;
- (错误)
- 自动增长
- 概念:如果某一列的数据类型为数值类型,可以使用
auto_increment
设置值的自动增长 - 创建表时,添加主键约束,并且设置自动增长
create table stu( id int primary key auto_increment,-- 给id添加主键约束 name varchar(20) ); 复制代码
- 创建表后,设置自动增长:
ALTER TABLE stu MODIFY id INT AUTO_INCREMENT;
- 删除自动增长:
ALTER TABLE stu MODIFY id INT;
- 概念:如果某一列的数据类型为数值类型,可以使用
- 注意
- 外键约束:
foreign key
,让表与表产生关系,从而保证数据的正确性- 创建表时添加外键:
create table 表名( ... 外键列名 数据类型, constraint 外键名称 foreign key (外键列名) references 主表名称(主表列名) ); 复制代码
- 删除外键:
alter table 表名 drop foreign key 外键名称;
- 创建表后添加外键:
alter table 表名 add constraint 外键名称 foreign key (外键列名) references 主表名称(主表列名);
- 级联操作
- 添加级联:
alter table 表名 add constraint 外键名称 foreign key (外键列名) references 主表名称(主表列名) on update cascade on delete cascade;
- 级联分类
- 级联更新:
on update cascade
- 级联删除:
on delete cascade
- 级联更新:
- 添加级联:
- 外键可以为null,但是不可以为不存在的外键值
- 创建表时添加外键:
2. 数据库的设计
1. 多表之间的关系
- 一对多(多对一)
- 在多的一方建立外键,指向一的一方的主键
- 多对多
- 借助第三张中间表,中间表至少包含两个字段,这两个字段作为中间表的外键,分别指向两张表的主键
- 一对一
- 在任意一方添加唯一外键指向另一方的主键
- 一对一通常合并为一张表,不必拆分为两张表。
2. 范式
- 概念
- 设计数据库时,为了设计出合理的关系型数据库,所遵循的不同的规范要求
- 相关概念
- 函数依赖
- B依赖于A:通过A属性(属性组)的值,可以唯一确定B属性的值
- 例如:学号->姓名,(学号,课程名称)->成绩
- 完全函数依赖
- B完全依赖于A:A是一个属性组,A属性组中所有的属性值才能唯一确定B属性的值
- (学号,课程名称)->成绩
- 部分函数依赖
- B部分依赖于A:A是一个属性组,A属性组中部分属性值就能唯一确定B属性的值
- (学号,课程名称)->姓名
- 传递函数依赖
- C传递依赖于A:C依赖于B,B依赖于A
- 学号->专业->辅导员
- 码
- 被其他所有属性完全依赖的属性(属性组)
- 主属性:码属性组的所有属性
- 非主属性:除了码属性组中属性的其他属性
- 函数依赖
- 分类
- 第一范式(1NF)
- 每一列都是不可分割的原子数据项
- 第二范式(2NF)
- 在1NF的基础上,非主属性必须完全依赖于主属性(在1NF的基础上,消除非主属性对主属性的部分函数依赖)
- 第三范式(3NF)
- 在2NF的基础上,任何非主属性不依赖于其他非主属性(在2NF的基础上,消除传递依赖)
- 巴斯-科德范式(BCNF)
- 第四范式(4NF)
- 第五范式(5NF,又称完美范式)
- 第一范式(1NF)
3. 数据库的备份和还原
- 命令行方式
- 备份:mysqldump -u用户名 -p密码 数据库名称 > 保存的路径
- 还原
- 登录数据库
- 创建数据库
- 使用数据库
- 执行文件:source 文件路径
mysqldump -uroot -proot db4 > d://a.sql -- 备份 -- 删除数据库db4之后 mysql -uroot -proot -- 登录数据库 create database db4; -- 创建数据库 use db4; -- 使用数据库 source d://a.sql -- 执行文件 复制代码
- 图形化工具方式
- 略
4. 事务
- 概念:一个事务包含的多个操作,这些操作要么同时成功,要么同时失败
- 操作
- 开启事务:
start transaction;
- 回滚:
rollback;
- 提交:
commit;
- 开启事务:
- 提交事务的方式
- 自动提交(MySQL):执行一条DML语句会自动提交一次事务
- 手动提交(Oracle):需要先开始事务,再提交
- 查看事务的提交方式:
select @@autocommit;
- 1:表示自动提交(默认)
- 0:表示手动提交
- 修改事务的提交方式:
set @@autocommit = 0;
- 事务的四大特征
- 原子性:事务是不可分割的最小操作单位,事务所包含的操作要么同时成功,要么同时失败
- 持久性:当事务提交或回滚后,数据库会持久化地保存数据
- 隔离性:多个事务之间是相互独立的
- 一致性:事务操作前后,数据总量不变
- 事物的隔离级别
- 概念:多个事务之间是相互独立的,但是如果多个事务同时操作同一批数据,就会引发一些问题,设置不同的隔离级别可以解决这些问题
- 存在的问题
- 脏读:一个事务读取到了另一个事务还未提交的数据
- 不可重复读(虚读):对于同一个事务,两次读取到的数据不一样
- 幻读:A事务操作(DML)表中的所有记录,B事务添加了一条数据,那么A事务查询不到自己的更改
- 隔离级别
read uncommitted
:读未提交- 存在的问题:脏读、不可重复读、幻读
read committed
:读已提交(Oracle默认)- 存在的问题:不可重复读、幻读
repeatable read
:可重复读(MySQL默认)- 存在的问题:幻读
serializable
:串行化- 解决了所有问题
- 隔离级别从小到大安全性越来越高,但是效率越来越低
- 查询隔离级别:
select @@tx_isolation
- 设置隔离级别:
set global transaction isolation level 隔离级别字符串;
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END