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