2021-03-14-数据库学习之3-约束、多表关系、三大范式

一、约束

  • 概念:对表中的数据进行限定,保证数据的正确性、有效性和完整性。让非法数据不能添加到表中。
  • 约束种类:
    • 主键约束:primary key
    • 非空约束:not null
    • 唯一约束:unique
    • 外键约束:foreign key
  • 一、非空约束:
  • not null ,值不能为空
  • 1.创建表时添加约束
CREATE TABLE stu8(
	id INT,
	NAME VARCHAR(20) NOT NULL -- name为非空
);
SELECT * FROM stu8;
  • 2.创建表完后,添加非空约束
-- 创建表完后,添加非空约束
ALTER TABLE stu8 MODIFY NAME VARCHAR(20) NOT NULL;
  • 3.删除非空约束
-- 删除name的非空约束
ALTER TABLE stu8 MODIFY NAME VARCHAR(20);

在这里插入图片描述

  • 二、唯一约束:
  • unique,值不能重复
  • 1.创建表时,添加唯一约束
CREATE TABLE stu9(
	id INT,
	phone_number VARCHAR(20) UNIQUE -- 添加了唯一约束phone_number不能重复
);

-- 注意unique中,唯一约束限定的列的值可以有多个null
  • 2.删除唯一约束
-- 删除唯一约束
-- alter table stu9 modify phone_number varchar(20); -- 此写法错误,不能这么删
ALTER TABLE stu9 DROP INDEX phone_number;
  • 3.在创建表后,添加唯一约束
-- 创建表后,添加唯一约束
ALTER TABLE stu9 MODIFY phone_number VARCHAR(20) UNIQUE;

SELECT *FROM stu9;
  • 三、主键约束
  • primary key:
    • 含义是非空且唯一
    • 一张表只能有一个字段为主键
    • 主键就是表中记录的唯一标识
  • 1.在创建表时,添加主键约束
create table stu10(
	id int primary key,-- 给 id 添加主键约束
	name varchar(20)
);
  • 2.删除主键
-- 删除主键
-- 错误:alter table stu10 modify id int;
ALTER TABLE stu10 DROP PRIMARY KEY;
  • 3.创建完表后添加主键
-- 创建完表后添加主键
ALTER TABLE stu10 MODIFY id INT PRIMARY KEY;

SELECT * FROM stu10;
  • 四、自动增长
    • 概念:如果某一列是数值类型的,使用 auto_increment 可以来完成值的自动增长
  • 1.在创建表时,添加主键约束,并且完成主键自动增长
create table stu11(
	-- 给主键 id 添加主键约束
	id int primary key auto_increment,
	name varchar(20)
);
  • 2.删除自动增长、添加自动增长
CREATE TABLE stu11(
	-- 给主键 id 添加主键约束
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20)
);

-- 删除自动增长
ALTER TABLE stu11 MODIFY id INT;

-- 添加自动增长
ALTER TABLE stu11 MODIFY id INT AUTO_INCREMENT;


INSERT INTO stu11 VALUES(NULL,'ccc');
INSERT INTO stu11 VALUES(12,'ccc');

SELECT * FROM stu11;
  • 五、外键约束
  • foreign key:让表与表产生关系,从而保证数据的准确性。
  • 第1步:
CREATE TABLE emp (  -- 创建emp表
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(30),
	age INT,
	dep_name VARCHAR(30), -- 部门名称
	dep_location VARCHAR(30) -- 部门地址
);

-- 添加数据
INSERT INTO emp(NAME,age,dep_name,dep_location) VALUES('张三',20,'研发部','广州');
INSERT INTO emp(NAME,age,dep_name,dep_location) VALUES('李四',21,'研发部','广州');
INSERT INTO emp(NAME,age,dep_name,dep_location) VALUES('王五',20,'研发部','广州');
INSERT INTO emp(NAME,age,dep_name,dep_location) VALUES('老王',20,'销售部','深圳');
INSERT INTO emp(NAME,age,dep_name,dep_location) VALUES('大王',22,'研发部','深圳');
INSERT INTO emp(NAME,age,dep_name,dep_location) VALUES('小王',18,'研发部','深圳');

SELECT * FROM emp;

输出:
在这里插入图片描述
执行以上代码,发现表中的数据有冗余,需要进行表的拆分,分成两张表,一张表存放员工信息,另一表存放部门信息,然后两张表进行关联即可。

  • 第2步
-- 表的拆分,分成两张表,一张表存放员工信息,另一表存放部门信息,然后两张表进行关联即可
-- 创建部门表(id,dep_name,dep_location)
-- 一方,主表
CREATE TABLE department(
	id INT PRIMARY KEY AUTO_INCREMENT,
	dep_name VARCHAR(30),
	dep_location VARCHAR(30)
);
-- 创建员工表(id,name,age,dep_id)
-- 多方,从表
CREATE TABLE employee(
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(20),
	age INT,
	dep_id INT  -- 外键对应主表的主键
);
-- 添加 2 个部门
INSERT INTO department VALUES(NULL,'研发部','广州'),(NULL,'销售部','深圳');
-- 添加员工,dep_id 表示员工所在的部门
INSERT INTO employee(NAME,age,dep_id) VALUES('张三',20,1);
INSERT INTO employee(NAME,age,dep_id) VALUES('李四',21,1);
INSERT INTO employee(NAME,age,dep_id) VALUES('王五',20,1);
INSERT INTO employee(NAME,age,dep_id) VALUES('老王',20,2);
INSERT INTO employee(NAME,age,dep_id) VALUES('大王',20,2);
INSERT INTO employee(NAME,age,dep_id) VALUES('小王',18,2);

SELECT * FROM department;
SELECT * FROM employee;

输出:
在这里插入图片描述
在这里插入图片描述

  • 第3步
    让employee的dep_id关联department的主键id,二者铲产生外键关系 。
    (1)在创建表时,可以添加外键
    语法:
create table 表名(
		...
		外键列
		constraint 外键名称 foreign key (外键名称) references 主表名称(主列名称)
);

关联以后就不能删除department里面的东西了,可以给employee添加符合dep_id范围的元素。
(2)删除外键

-- 删除外键,删除后可以随便给employee中的dep_id添加元素了
ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

-- 例如
ALTER TABLE employee DROP FOREIGN KEY emp_dep_fk;

(3)在创建表后添加外键

-- 添加外键
ALTER TABLE 表名 ADD CONSTRAINT 外键名称FOREIGN KEY (外界字段名称) REFERENCES department(主表列名称);

-- 例如
ALTER TABLE employee ADD CONSTRAINT emp_dep_fk FOREIGN KEY (dep_id) REFERENCES department(id);
  • 六、_约束_外键约束_级联操作
    希望外键改变的同时,使用外键的表对应的元素也能自动变化。
  • 方法1,比较复杂
UPDATE employee SET dep_id = NULL WHERE dep_id = 1;
-- 然后手动将department的研发部门地址改成5,再执行下面一行代码
UPDATE employee SET dep_id = 5 WHERE dep_id IS NULL;

SELECT * FROM employee;
SELECT * FROM department;

输出:
在这里插入图片描述
在这里插入图片描述

  • 方法2,期望与外键关联的值可以自动改变
    (1)执行删除外键:
-- 删除外键,删除后可以随便给employee中的dep_id添加元素了
ALTER TABLE employee DROP FOREIGN KEY emp_dep_fk;

然后选择架构设计器:
在这里插入图片描述
在这里插入图片描述
(2)重新添加外键:

-- 添加外键,设置级联更新
ALTER TABLE employee ADD CONSTRAINT emp_dep_fk FOREIGN KEY (dep_id) REFERENCES department(id);

在这里插入图片描述
(3)删除外键,再重新添加外键并设置级联更新
添加级联操作语法:

ALTER TABLE 表名 ADD CONSTRAINT 外键名称FOREIGN KEY (外键字段名称) REFERENCES 主表名称(主表列名称) ON UPDATE CASCADE ;

分类:级联更新、级联删除
例如:

-- 删除外键,删除后可以随便给employee中的dep_id添加元素了
ALTER TABLE employee DROP FOREIGN KEY emp_dep_fk;

-- 添加外键,并且设置级联更新
ALTER TABLE employee ADD CONSTRAINT emp_dep_fk FOREIGN KEY (dep_id) REFERENCES department(id) ON UPDATE CASCADE ;

然后将department的研发部地址改为1,此时可以成功保存.
在这里插入图片描述
执行SELECT * FROM employee;后,自动变为1:
在这里插入图片描述
(4)删除外键,并且设置级联更新,同时设置级联删除

-- 删除外键,删除后可以随便给employee中的dep_id添加元素了
ALTER TABLE employee DROP FOREIGN KEY emp_dep_fk;

-- 添加外键,并且设置级联更新,同时设置级联删除
ALTER TABLE employee ADD CONSTRAINT emp_dep_fk FOREIGN KEY (dep_id) REFERENCES department(id) ON UPDATE CASCADE ON DELETE CASCADE ;

然后将department的研发部删除,则employee也自动没有了研发部成员:
在这里插入图片描述
在这里插入图片描述

二、多表之间的关系

  • 1.多表关系介绍
    • 一对一:如人和身份证
    • 一对多(多对一):如部门和员工
    • 多对多:如学生和课程
  • 2.一对多关系实现
    在这里插入图片描述
    实现方式:在多的一方建立外键,指向一的一方的主键。
  • 3.多对多关系实现
    在这里插入图片描述
    多对多关系的实现需要借助第三张中间表。中间表至少包含两个字段,这两个字段作为第三张表的外键,分别指向两张表的主键。
  • 4.一对一关系实现
    在这里插入图片描述
    一对一关系实现可以在任意一方添加唯一外键指向另一方的主键。
  • 5.多表关系案例
    在这里插入图片描述
    代码:
-- 创建旅游线路分类表 tab_category
-- cid 旅游路线分类主键,自动增长
-- cname 旅游路线分类名称非空,唯一,字符串 100
CREATE TABLE tab_category(
	cid INT PRIMARY KEY AUTO_INCREMENT,
	cname VARCHAR(100) NOT NULL UNIQUE
);
/*
rid 旅游线路主键,自动增长
rname 旅游线路名称非空,唯一,字符串 100
price 价格
rdate 上架时间,日期类型
cid 外键,所属分类
*/
CREATE TABLE tab_route(
	rid INT PRIMARY KEY AUTO_INCREMENT,
	rname VARCHAR(100) NOT NULL UNIQUE,
	price DOUBLE,
	rdate DATE,
	cid INT,
	FOREIGN KEY (cid) REFERENCES tab_category(cid) -- 添加外键省略语法
);
/*
创建用户表 tab_user
uid 用户主键,自增长
username 用户名长度 100,唯一,非空
password 密码长度 30,非空
name 真是姓名长度 100
birthday 生日
sex 性别,定长字符串 1
telephone 手机号,字符串 11
email 邮箱,字符串长度 100
*/
CREATE TABLE tab_user(
	uid INT PRIMARY KEY AUTO_INCREMENT,
	username VARCHAR(100) NOT NULL UNIQUE,
	PASSWORD VARCHAR(30) NOT NULL,
	NAME VARCHAR(100),
	birthday DATE,
	sex CHAR(1) DEFAULT '男', -- 默认为男性
	telephone VARCHAR(11),
	email VARCHAR(100)
);
/*
创建收藏表tab_favorite
rid 旅游线路 id,外键
date 收藏时间
uid用户 id,外键
rid和uidbu不能重复,设置复合主键,同一个用户不能收藏同一个线路两次
*/
CREATE TABLE tab_favorite(
	rid INT, -- 线路id
	DATE DATETIME,
	uid INT, -- 用户id
	-- 创建复合主键
	PRIMARY KEY(rid,uid), -- 联合主键
	FOREIGN KEY(rid) REFERENCES tab_route(rid),
	FOREIGN KEY(uid) REFERENCES tab_user(uid)
);

架构设计器
在这里插入图片描述

三、范式

  • 1.概念:设计数据库时,需要遵循的一些规范。要遵循后边的范式要求,必须先遵循前边的所有范式要求。
    设计关系数据库时,遵从不同的规范要求,设计出合理的关系型数据库,这些不同的规范要求被称为不同的范式,各种范式呈递次规范,越高的范式数据库冗余越小。
    目前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。
  • 2.分类
    (1)第一范式(1NF):数据库表的每一列都是不可分割的原子数据项。
    (2)第二范式(2NF):在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)。
    (3)第三范式(3NF):在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)。
  • 3.三大范式详解
    (1)第一范式
    在这里插入图片描述
    存在问题:
    1.存在非常严重的数据冗余(重复):姓名、系名、系主任。
    2.数据添加存在问题:添加新开设的系和系主任时,数据不合法。
    3.数据删除也存在问题:张无忌毕业了,删除数据,回将系的数据一起删掉。
    (2)第二范式
    在1NF的基础上,非码属性必须完全依赖于候选码(在1NF基础上消除非主属性对主码的部分函数依赖)。让所有的非主属性都完全依赖于主码。
  • 函数依赖:A–>B,如果通过A属性(属性组)的值,可以确定唯一B属性的值,则称B依赖于A。如学号被姓名所依赖。学号–>姓名。属性组情况:(学号,课程名称)–>分数。
  • 完全函数依赖:A–>B,如果A是一个属性组,则B属性值的确定需要依赖于A属性组中所有的属性值。例如:(学号,课程名称)–> 分数。
  • 部分函数依赖:A–>B,如果A是一个属性组,则B属性值的确定只需要依赖于A属性中某一些值即可。例如:(学号,课程名称)–> 姓名。
  • 传递函数依赖:A–>B,B – >C,如果通过A属性(属性组)的值,可以确定唯一B属性的值,再通过B属性(属性组)的值可以确定唯一C属性的值,则称C传递函数依赖于A。例如:学号 – >系名,系名 – >系主任。
  • 码:如果在一个表中,一个属性或属性组,被其他所有属性完全依赖,则称这个属性(属性组)为改表的码。例如:该表中码为:(学号,课程名称)
  • 主属性:码属性组中的所有属性
  • 非主属性:除过码属性组的属性
    第二范式存在问题:
    1.数据添加存在问题:添加新开设的系和系主任时,数据不合法。
    2.数据删除也存在问题:张无忌毕业了,删除数据,回将系的数据一起删掉。
    (3)第三范式
    在2NF基础上,任何非主属性不依赖于其它非主属性(在2NF基础上消除传递依赖)。在这里插入图片描述
    不存在第一范式和第二范式的问题。

四、数据库的备份和还原

  • 1.命令行:
    • 备份语法:mysqldump -u用户名 -p密码 数据库名称 > 保存的路径
    • 还原语法:
      • 登录数据库
      • 创建数据库
      • 使用数据库
      • 执行文件。source 文件路径
        在这里插入图片描述
        在这里插入图片描述
        在这里插入图片描述
  • 2.图形化工具
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力学习的代码小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值