数据库约束
- 1:约束的几个类型
- 2:NOT NULL非空约束
- 3:UNIQUE 唯⼀约束
- 4:PRIMARY KEY 主键约束
- 4.1:回顾
- 5:FOREIGN KEY 外键约束
- 5.1:创建班级表(主表),并初始化数据
- 5.2:重构学⽣表(从表),加⼊外键约束
- 6:DEFALUT 默认值约束
- 7:CHECK 约束
数据库约束是关系型数据库的一个重要约束
主要保证数据插入的有效性(数据本身是否正确,关联关系是否正确)
人工检查数据工作量太大了,在数据库中定义一些约束,那么数据在写入数据库时候,就会帮助我们做一些检查。
1:约束的几个类型
类型 | 说明 |
---|---|
NOT NULl非空约束 | 指定非空约束列不能出现NULL 值 |
DEFALUT 默认约束 | 当前没有给指定列值时候。默认使用默认值。 |
UNIQUE 唯一约束 | 指定唯一约束的列,这条列上面不能出现相同的值 |
FRIMARY KEY 主键约束 | NOT NULL和UNIQUE的结合,可以指定一个或者多个列(复合主键),但是只能有一个主键,有助于数据的查询 |
POREIGN KEY 外键约束 | 外键约束关联两张表 |
CHECK 约束 | 用于限制或数据库表中的值,确保数据可靠性,准确性 |
2:NOT NULL非空约束
创建一个表:
创建一个学生表中,name一般不能为NULL,名字为那样就没有意义。我们就要给名字加上NOTNULL 非空约束条件;
我们查询表结构,就可以看出来NULL那一列为no表示不能为NULL值
这样name这一列添加NULL就会报错。
3:UNIQUE 唯⼀约束
当我们设置让一个列有唯一值时候,就可以给这列设置UNIQUE ,比如我们让id列为唯一值;
创建一个表:
我们给id列限制了UNIQUE,id就不能插入重复值,所有当第二次插入数据时候,就报错了,但是可以插入NULL
4:PRIMARY KEY 主键约束
主键约束唯⼀标识数据库表中的每条记录。
主键必须包含唯⼀的值,且不能包含 NULL 值。
每个表只能有⼀个主键,可以由单个列或多个列组成。
通常为每张表都指定⼀个主键,主键列建议使⽤BIGINT类型
比
主键=唯一+非空。
我们也可以给主键加入自增列标识:
我们在设置AUTO_INCREMENT前id列是不可以插入NULL,但是设置后,可以插入NULL,但是NULL会被转化id自增列的数据
我们也可以手动设置主键列的值auto_increment
下次auto_increment 就是从1001开始计数。
每个表只能有一个主键
但是一个主键可以包含多个列:
如果是复合健必须所有列都是一样的才能被判定为一样。、
替换,如果存在冲突则替换,不存在冲突则插⼊
# 语法
REPLACE [INTO] table_name[(column [, column] ...)]
VALUES(value_list) [, (value_list)] ...
value_list: value, [, value] ...
4.1:回顾
接下来介绍一下自增操作:
自增操作不管插入数据失败还是成功都不会回退,自增操作在插入的前面。
5:FOREIGN KEY 外键约束
外键⽤于定义主表和从表之间的关系
外键约束主定义在从表的列上,主表关联的列必须是主键或唯⼀约束
当定义外键后,要求从表中的外键列数据必须在主表的主键或唯⼀列存在或为null。
5.1:创建班级表(主表),并初始化数据
5.2:重构学⽣表(从表),加⼊外键约束
# 语法:
foreign key (id) references class(id)
drop table if exists student;# 重构表
create table student(
id bigint PRIMARY KEY auto_increment, name varchar(20) not null,age int DEFAULT 18,class_id bigint,foreign key (class_id) references class(id) # 创建外键约束
);
查看表结构,Key列的值为MUL表⽰外键约束的列
正常插⼊数据
插⼊⼀个班级号为100的学⽣,由于主表中没有这个班级,插⼊失败
插⼊班级Id为NULL的记录,可以成功,表⽰当前学⽣还没有分配置班级
删除主表某条记录时,从表中不能有对该记录的引⽤
删除主表某条记录时,从表中不能有对该记录的引⽤
删除主表时要先删除从表
6:DEFALUT 默认值约束
DEFAULT 约束⽤于向列中插⼊默认值,如果没有为列设置值,那么会将默认值设置到该列
语法:
DEFALUT 默认值
7:CHECK 约束
可以应⽤于⼀个或多个列,⽤于限制列中可接受的数据值,从⽽确保数据的完整性和准确性。在8.0.16开始全⾯⽀持CHECK约束,之前的版本会忽略CHECK的定义
但是注意,一般再应用程序级别校验
create table student(id bigint PRIMARY KEY auto_increment, # 设置⾃增主键name varchar(20) not null,age int DEFAULT 18,gender char(1),check (age >= 16),check (gender = '男' or gender = '⼥')
);
列与列之间也可以⽐较,需要在单独⼀⾏中定义
create table t_check (c1 int check(c1 <> 0),c2 int check(c2 > 0),c3 int,check(c3 >= c2)
);