1. 什么是数据库约束
数据库约束是指对数据库表中的数据所施加的规则或条件,⽤于确保数据的准确性和可靠性。这
些约束可以是基于数据类型、值范围、唯⼀性、⾮空等规则,以确保数据的正确性和相容性.
针对表的数据内容做出限制
创建表的时候,确定出来,跟随建表语句,一起被设置的数据库服务器中
为啥要有这样的限制?????
人,是不靠谱的!! 人可能会出错,把数据库中的值, 给搞错
2. 约束类型

2.1 NOT NULL 非空约束
定义表时某列不允许为NULL时,可以为列添加⾮空约束。
创建一个学生表,学生ID不能为空,否则就会报错
sql
drop table student;
create table student(id int not null, name varchar(20));
insert into student values(null,null);
select * from student;
2.2 DEFAULT 默认值约束
default约束用于向列中插入默认值,如果没有为列设置值,那么会将默认值设置到该列
sql
select * from student;
create table student(id int, name varchar(20) default '无名');
insert into student (id) values(2);
desc student;
2.3 UNIQUE 唯一约束
指定了唯⼀约束的列,该列的值在所有记录中不能重复,⽐如⼀个⼈的⾝份证号
sql
desc student;
create table student(id int unique,name varchar(20));
此处的"插入"会先触发一个"查询" Mysql自动进行的
对于空值是例外. 空值和空值之间. 不视为重复
2.4 PRIMARY KEY 主键约束
主键约束唯⼀标识数据库表中的每条记录。
主键必须包含唯⼀的值,且不能包含 NULL 值。
每个表只能有⼀个主键,可以由单个列或多个列组成。
通常为每张表都指定⼀个主键,主键列建议使⽤BIGINT类型
sql
create table student(id int primary key, name varchar(20));
相当于unique + not null
一个表里,只能有一个主键
2.4.1 自增主键
针对整数类型的列,可以指定自增主键
sql
drop table student;
create table student(id int primary key auto_increment, name varchar(20));
select * from student;
insert into student values(1,'张三');
insert into student values(2,'李四');
insert into student values(null,'王五');
insert into student values(100,'赵六');
只会根据表中最大值**+1. 即使你把最大值删除了,也是按照之前的最大值来相加**
自增主键, 对于分布式场景无法应对
2.5 FOREIGN KEY 外键约束
外键⽤于定义主表和从表之间的关系
外键约束主定义在从表的列上,主表关联的列必须是主键或唯⼀约束
当定义外键后,要求从表中的外键列数据必须在主表的主键或唯⼀列存在或为null。
针对两张表进行
sql
drop table student;
drop table class;
create table class(class_id int primary key auto_increment, calss_name varchar(20));
insert into class values(null,'java100'),(null,'java101'), (null,'java102');
create table student(student_id int primary key auto_increment,studnet_name varchar(20),class_id int,
foreign key(class_id) references class(class_id));
insert into student values(null,'张三',1),(null,'李四',2),(null,'王五',3);
desc student;
select * from student;
select * from class;
insert into student values(null,'赵六',4);
当针对子表进行插入/修改的时候,就会查询父表,看你当前这个操作是否合法
针对父表进行删除/修改的时候,也会查询子表,也是要看当前操作是否合法的
create table class(class_id int primary key auto_increment, calss_name varchar(20));
primary key auto_increment 去掉 会发现student就创建不了
因为 Mysql强制要求,使用外键的时候,被关联的父表. 被关联的这一列,必须带有索引
主键列,默认自带索引
如果给class添加索引,也可以使用外键约束
假设商家,要把一件 商品下架,如何进行 删除 操作???
商品表(下架) 订单表(看到)
比如不用外键约束 ===>这个是下下策
要进行逻辑删除, 数据仍然保留在硬盘上, 但是把数据标记成无效
在商品表添加一个字段isOK
2.6 CHECK 约束
可以应⽤于⼀个或多个列,⽤于限制列中可接受的数据值,从⽽确保数据的完整性和准确性。
check 可以根据实际需求,灵活定义(自定义)
从Mysql 8 才支持
sql
create table student(id int, name varchar(20), age int, gender varchar(1),
check(age>=17),check(gender = '男' or gender = '女'));
insert into student values(1,'张三',10,'男');