Python全栈最全学习之路-数据库MySQL(二)

本文深入解析MySQL中的表约束,包括非空、唯一、主键、自增、默认及外键约束,以及如何实现一对一、一对多和多对多的表关系。同时,文章还介绍了数据库三范式的基本原则和事务的概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MySQL表约束和表关系

一、表约束

1、非空约束

在这里插入图片描述
数据库字段的某个值是否可以为空,NULL字段值可以为空,NOT NULL字段值不能为空,当字段设置为非空时,添加数据就必须要插入值,否则就会报错。

2、唯一约束

在这里插入图片描述
字段添加唯一约束之后,该字段的值不能重复,也就死活该字段的值在该表中唯一unique key
添加唯一约束

ALTER TABLE `tb_name` ADD [CONSTRAINT[symbol]] UNIQUE [INDEX | KEY] [index_name] [index_type] (index_col_nanme];

删除唯一约束

ALTER TABLE `ta_name` DROP {INDEX | KEY} index_name;

3、主键约束

在这里插入图片描述
主键保证记录的唯一性,主键自动为NOT NULL,每张数据表只能存在一个主键
添加主键约束

ALTER TABLE `tb_name` ADD [CONSTRAINT[sysbol]] PRIMARY KEY [index_type] (index_col_name);

删除主键约束,删除后次项只保留NOT NULL

ALTER TABLE `tb_name` DROP PRIMARY KEY;

4、自增约束

在这里插入图片描述
AUTO_INCREMENT自动编号,且必须与主键组合使用,默认情况下,起始值为1,每次的增量为1.
添加自增约束:

ALTER TALBE `tb_name` CHANGE `id` `id` INT PRIMARY KEY AUTO_INCREMENT;

删除自增约束:

ALTER TABLE `tb_name` CHANGE `id` `id` INT AUTO_INCREMENT;;

5、默认约束

在这里插入图片描述
DEFAULT(默认约束)初始值设置,插入记录时,如果没有明确为字段赋值,则自动赋予默认值

ALTER TABLE `tb_name` ALTER [COLUMN] col_name {SET DEFAULT literal | DROP default}

6、外键约束

在这里插入图片描述
每个学生都有一个学院,当学生还在这个学院时,学院是不能狗撤销的。但是二者不在同一个表中,因为为了约束学院表格不能随便撤销,可以在学生表上添加外键约束

6-1、约束对象

之前讲到的约束,都是表内约束自身,而外键约束是约束其他表

6-2、创建条件

数据表的存储引擎只能为lnnoDB
外键列和参照列数据类型一致
外键必须关联到键上面去
外键名在数据库要唯一

6-3、添加格式
ALTER TABLE yourtablename #需要添加外键的表
ADD [CONSTRAINT 外键名] FOREIGN KEY [id] (index_col_name,...)
REFERENCES tbl_name (index_col_name,...)
[ON DELETE {CASCADE | SET NULL | NO ACTION | RESTRICT}]
[ON UPDATE {CASCADE | SET NULL | NO ACTION | RESTRICT}]

CASCADE删除包含与已删除键值有参照关系的所有记录
SET NULL修改包含与已删除键值有参照关系的所有记录,使用NULL值替换(只能用于已标记为NOT NULL的字段)
RESTRICT拒绝删除要求,知道使用删除键的辅助表被手工删除,并且没有参照时(这是默认设置,也是最安全的设置)
NO ACTION啥也不做
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
字段添加唯一约束之后,该字段的值不重复,也就是该字段的值在该表中唯一unique key,删除父表元素时会报错

DELETE FROM `table_name` WHERE `id`=1;

当存在外键关联时,默认是不允许删除的,这样来保证数据的完整性

6-5、查看所有外键
SELECT 
		CONSTRAINT_NAME
FROM
		INFORMATON_SCHEMA_KEY_COLUMN_USAGE
WHERE
		CONSTAINT_SCHEMA = `mydb` AND
CONSTRAINT_NAME != `PRIMAPY`;

7、约束总结

约束,即对表数据的约束,除了外键约束,其他的都是对表自身数据的约束,外键约束是对其他表的约束

二、表关系

1、表关系

1-1、表关系概念

这里所谓的关系,指的是数据在逻辑上人赋予的关系
比如:每一个用户表里面存放用户的信息,再定一个用户信息详细表,用来存放用户的详细信息,这个详细信息表就是用户表的就存在一个一对一的关系

1-2、关系分类

一对一关系:如用户表对应用户的详细信息
一对多关系:如一个学院当中,有若干学生
多对多关系:如课程和学生之间,一个课程有很多学生,一个学生对应很多课程

2、一对一关系

在这里插入图片描述
一对一关系,指的是一个实体的某个数据与另外一个实体的一个数据有关联关系。
学生表中有学号、姓名、学院,但学生还有些比如电话,家庭住址等比较私密的信息,这些信息不会放在学生表当中,会新建一个学生的详细信息表来存放,这时的学生表和学生的详细信息表两者的关系就是一对一的关系,因为一个学生只有一条详细信息

3、一对多关系

在这里插入图片描述
一对多多对一是一个概念,指的是一个实体的某个数据与另外一个实体的多个数据有关联关系。
学校中一个学院可以有很多的学生,而一个学生只属于某一个学院(通常情况下),学院与学生之间的关系就是一对多的关系,通过外键关联来实现这种关系

4、多对多关系

在这里插入图片描述

多对多关系,一个实体的数据对应另外一个实体的多个数据,另外实体的数据也同样对应当前实体的多个数据。
学生要报名选修课,一个学生可以报名多们课程,一个课程有很多的学生报名,那么学生表和课程表两者就形成了多对多关系,对于多对多关系,需要创建第三张关系表,关系表中通过外键加主键的形式实现这种关系。
这里需要注意的是,在多对多关系中,我们常用中间表表示

三、数据库三范式

1、第一范式-1NF

第一范式(1NF):符合1NF的关系中每个属性都不可再分,1NF是所有关系型数据的最基本要求
简单来说,就是不能出现多个表头
在这里插入图片描述

2、第二范式-2NF

第二范式(2NF):2NF在1NF基础之上,消除了非主属性对于码的部分函数依赖
简单来说,只能描述一个对象(主键),其它列名(副键)与对象之间相互完全依赖
在这里插入图片描述

3、第三范式-3NF

第三范式(3NF):3NF在2NF的基础之上,消除了非主属性对于码的传递函数依赖
简单来说,所有非主属性只在整个数据库里面出现一次,副键与副键之间,不能存在依赖关系
范式的作用是尽可能避免数据的冗余和插入/删除/更新的异常
在这里插入图片描述

4、事务

数据库事务(transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位
简单来说:几个操作是绑定在一起的,要么都做完,要么一个都不做
在这里插入图片描述

四、视图

1、视图介绍

1-1、视图的作用

三范式让表查询变得复杂,对于常用的数据查询,反复写复杂的查询语句十分不方便,因此可以创建一个虚拟的表(不存数据),这个虚拟表的数据来源于数据库中存在的其他表,虚拟表的数据来源就在定义时给定

2、基本思路介绍

在这里插入图片描述
创建视图

CREATE [OR REPLACE]
	VIEW view_name [(column_list)]
	AS select_statement
	[WITH [CASCADED | LOCAL] CHECK OPTION]

删除视图

DROP VIEW view_name
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值