Mysql 数据库约束

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,'男');