文章目录
- 一、数据库约束
-
- [1.1 常见约束类型](#1.1 常见约束类型)
- [1.2 NOT NULL](#1.2 NOT NULL)
- [1.3 UNIQUE](#1.3 UNIQUE)
- [1.4 DEFAULT](#1.4 DEFAULT)
- [1.5 主键(PRIMARY KEY)](#1.5 主键(PRIMARY KEY))
- [1.6 外键(FOREIGN KEY)](#1.6 外键(FOREIGN KEY))
一、数据库约束
是关系型数据库的一个重要功能,约束一般是指定在列上的。
1.1 常见约束类型
| 约束类型 | 作用 |
|---|---|
| NOT NULL | 字段不能为空 |
| UNIQUE | 字段值不能重复 |
| PRIMARY KEY | 唯一 + 非空 |
| FOREIGN KEY | 建立表与表之间的关联 |
| DEFAULT | 设置默认值 |
约束的作用:
保证数据的准确性和完整性。
1.2 NOT NULL
- NOT NULL 表示某列不能存储NULL值
- NOT NULL的作用:
如果要把一个列定义为必填项,就可以使用NOT NULL非空约束
示例:

- 在创建表时,可以在相应字段加入约束类型
示例:

NO 表示当前列不能为空
YES 表示当前列可以为空
- 写入数据时会报错,提示不能写入NULL值,这是因为数据库做了校验

1.3 UNIQUE
- 保证某列的每行必须有唯一值,也就是说某列的值在整个表中不能重复
- 示例:

所以需要加入unique约束去创建表
示例:

示例:

⚠️ 注意:NULL值可以重复插入
1.4 DEFAULT
- 规定没有给列赋值时的默认值
- 示例:

- 在插入时,只指定了id,没有指定name,此时name用默认值填充
- 示例:

⚠️ 注意:
虽然指定了默认约束,但是当我们手动将这一列的值设置为NULL时,插入的值依然是NULL,因为此时的这个NULL值是我们手动指定的,也可以理解为我们想要的值。用户指定的优先级高于默认约束
示例:

1.5 主键(PRIMARY KEY)
NOT NULL 和 UNIQUE的结合,有助于更容易快速的找到表中特定的记录。
特点:
- 唯一
- 不能为空
- 一张表只能有一个主键
示例:
sql
create table student (
id int,
name varchar(50),
primary key (id)
);
-
id列指定的非空和唯一约束,列被表示为了PRI,表示他是一个主键
示例:

-
主键两个约束同时生效

⚠️ 注意:
设置主键的核心作用:唯一标识一条记录 + 提高查询效率 + 维护数据完整性 + 支持表关联
在实际开发中,
每张表都应该设计主键(一般使用自增 id)。 -
让数据库帮我们去维护主键的增长,在插入的时候,
先找到最大值,然后在这个基础上加1,生成一个新的值,作为新一个数据行主键(id列)的值。
示例:

-
全列插入
在写入数据时,不具体指定主键列的值,而是用NULL代替
示例:

-
指定列插入
当指定列插入,也会自动生成id,作为数据行的主键
示例:

-
可以指定主键
可以指定主键,只要主键不重复即可
示例:

-
主键值自增1
在最大值的基础上加1,所以主键值在数据表中有可能是不连续的

-
一个表中不允许有两个主键
-
示例:

⚠️ 注意:
一个主键可以同时包含多个列(复合主键)
示例:

-
这里id和name复合主键中的列值都相同,所以被判定为相同,第二条数据插入失败

1.6 外键(FOREIGN KEY)
外键用于建立两张表之间的联系。
sql
foreign key (字段名) references 主表(列)
说明:
- foreign key:创建外键的关键字
- 字段名:表示当 前表中哪个字段与主表建立主外键关系
- references:关键字,表示后面要引用哪个表中的哪个列
- 主表(列):指定主表和相应的列
⚠️ 注意:
- 外键字段必须与被关联字段类型一致
- 用于维护数据之间的关联关系
示例:
创建班级表和学生表(但不创建外键)
学生表中有一个字段是班级编号,写入数据时,这个编号必须是有效的

在class表中插入几个班级

在student表中插入了编号5这个班级,但这个班级根本不存在,此时,数据依然能写入成功,是不合理的。

示例:
创建班级表和学生表(但创建外键)




这里不存在编号为5的班级,所以插入数据失败。
⚠️ 注意 :
当子表中存在对主表的依赖的时候,能不能删除主表中相应的记录?

依然会报主外键关系的错误。
所以如果想要删除主表中的记录,子表中不能有对该记录的依赖。也就意味着,需要先删除子表中的记录,再去删主表中的记录。
