目录
[🚩NOT NULL](#🚩NOT NULL)
[🚩PRIMARY KEY](#🚩PRIMARY KEY)
[🚩FOREIGN KEY](#🚩FOREIGN KEY)
🌴数据库约束
约束可以理解成,数据库提供的一种针对数据的合法性,验证的一种机制。
数据库中经常会涉及到大量的数据,也会涉及到大量的增删改查操作,如果数据库不提供这样的校验机制,就只能靠程序员手工来保证数据是靠谱的,但是一旦涉及到人工基本认为是不靠谱的,所以通过程序自动化的检查,才是更科学的。
🚩约束类型
NOT NULL- 指示当前列不能存储 NULL 值。
UNIQUE - 保证某列的每行必须有唯一的值(不能重复)。
DEFAULT - 规定没有给列赋值时的默认值,没有设置即为NULL。
PRIMARY KEY - NOT NULL 和 UNIQUE 的结合。称为主键,确保某列(或两个列多个列的结合)有唯一标识,有助于更容易更快速地找到表中的一个特定的记录。
FOREIGN KEY- 保证一个表中的数据匹配另一个表中的值的参照完整性,称为外键。
CHECK - 保证列中的值符合指定的条件。对于MySQL数据库,对CHECK子句进行分析,但是忽略CHECK子句。但是MySQL5.7不能使用
🚩NOT NULL
不能为空!
不加not null:
加上not null:
当我们插入空值时,就会报错:
不只是针对插入操作,对于修改操作也是一样的:
🚩UNIQUE
确保唯一性!
不加unique约束:可重复插入
加上unique约束:
加上unique之后效率就会降低,但是对数据的校验就更严格了!
🚩DEFAULT
设置默认值!设置好了之后,后续进行指定列插入的时候,未被指定的列就会保持默认值。
当前这张表中,默认的默认值就是NULL
当我们指定列插入时,未被指定的列默认值就是NULL:
修改默认值:
注意:unique和default是有一定冲突的,unique是不能重复,但是设置default之后,当多个未被指定列插入时就为空,这是重复的,使用是注意两个用法!
🚩PRIMARY KEY
主键:一条记录的身份标识
例如,在C语言中,我们可根据两个变量的地址来判断是否是同一个变量,这个地址就是身份标识。在MySQL中,通过主键来判断是否为同一条记录。
在MySQL中,主键的两个要求:
- 不能为空
- 不能重复
设置主键:
插入数据:
一般给表设置主键时,都是使用数字(整数形式),很少使用字符串。且一个表只能有一个主键。
primary key = not null + unique,即创建主键时还可以直接使用not null + unique的形式创建:
上述谈到,一般主键会使用整数id作为主键,但是在实际开发中,id的值该如何选择,如何确定你插入id的值是唯一的呢?
自增主键:mysql中提供了自增主键,每次插入新的数据,都可以把主键基于上一条数据的主键 +1
设置自增主键:
插入数据:此时就不需要手动指定主键了
也可以手动插入,不一定非要使用自增主键:
此时,当我们再次使用自增主键插入时,得到的id就是101了:
当我们删掉101这条数据时,再次使用自增主键插入id为102:
自增主键的其他场景:
🚩FOREIGN KEY
外键约束,两张表直接的关联关系,例如学生表和班级表。
不指定外键约束:
创建班级表
创建学生表:原则上来说,插入学生表的数据中的classId,必须要在class表中存在,插入的学生才是有意义的(从属于某个班级),但是呢插入了一个班级为100这样的数据,正常来说是不能插入成功,这里却插入成功了。这就是一条有问题的数据
加上外键约束:
创建班级表
创建学生表(指定外键约束)
在学生表中插入数据,会受到外键约束的制约
在学生表中修改数据,也会受到外键约束的制约
修改父表:
尝试直接删除父表中的数据,发现这里的删除操作成功了,但是这里所删除的classId为3的班级,其实并没有被学生表所引用,我们在上述将id为3的这条记录进行了修改到classId为2的班级,所以能删除成功!
删除另一个班级,这里就删除失败了,即父表也受子表的约束!他们是双向的!
修改即一样!
创建外键的注意事项:
删除表时,现删除子表,再删父表
创建表,发现此时却创建不了了,是因为引用的父表这一列要么是主键,要么是unique,要具有唯一性,由于这里没有设置主键,即失败。
🚩CHECK
🎄表的设计
给你一个需求场景,能够结合场景把表如何创建给写出来,有几个表,每个表是干啥的,每个表里都有哪些属性,这些属性之间是否有一些关联关系......
设计表的通用步骤:
- 1.理清楚需求场景中的"实体"(entry)有哪些.
实体即为面向对象中的对象,所谓对象也就是针对实际问题中的一些实际情况,在代码中进行"抽象的表示"。
所谓抽象,信息量越多越具体,信息量越少越抽象。
- 2.理清楚实体之间的关系
大致分为以下三种:
🚩一对一
一个人只有一个身份证号,一个身份证号对应一个人
🚩一对多
一个班级包含多个学生,一个学生只能有一个班级
🚩多对多
一个学生对应多个课程,一个课程对应多个学生