文章目录
- 前言
- [一、not null(非空约束)](#一、not null(非空约束))
- [二、default (默认约束)](#二、default (默认约束))
- [三、unique (唯一约束)](#三、unique (唯一约束))
- [四、primary key (主键约束)](#四、primary key (主键约束))
- [五、foreign key (外键约束)](#五、foreign key (外键约束))
- 六、check (约束)
前言
- 什么是约束?
- 针对表的数据内容做出限制
- 这种约束在创建表的时候,确定出来,跟随建表语句,一起被设置到数据库服务器中
- 为什么要有这样的限制?
- 因为人是不靠谱的,人可能会出错,把数据库中的值,给搞错
- 机器是靠谱的,程序是靠谱的
- 所以人来操作,机器来检查
- 当人的操作造成一些不科学,不正确的数据时,给人提示
一、not null(非空约束)
sql
create table 表名(列名 类型 not null);
- 使用的是 not null
- 表明 在这个表中整删改查时,被 not null 修饰的列 的值 不能为空
- 我要给 student 中的 id 设置为不能为空
sql
create table student (id int not null , name varchar(20));
- 效果如下

二、default (默认约束)
sql
create table 表名(列名 类型 default(默认值));
- 使用的是 default
- 如果不给数据 给 被 default 修饰的列 ,这时就会给默认值
- 指定列插入的时候,未被指定到的列就是默认值
- student 表中 ,当 name 这列不输入值时,默认为无名氏
sql
create table student (id int , name varchar(20) defaule('无名氏'));
- 效果如下

三、unique (唯一约束)
sql
create table 表名(列名 类型 unique);
- 被 unique 修饰的列,确保插入的值在所有行的对应列中,是唯一的
- 在插入数据时,系统会默认帮我们检查被 unique 修饰的列 ,插入的该列的数据是否在表中已经存在,存在就不能插入 (先遍历表,再插入)
- 空值和空值之间,则不视为重复
- 在student 表中,要把 id ,这一列设置为唯一约束
sql
create table student(id int unique , name varchar(20));
- 效果如下

四、primary key (主键约束)
sql
create table 表名(列名 类型 primary key);
- 这相当于给数据定义一个身份标识。比如我找到这个身份标识,就相当于我找到了这条数据
- 唯一 和 不能为空 约束
- 被 primary key 修饰的列,不能为空并且在表中是唯一的存在。相当于 unique + not null 修饰。(有意思的是,用 unique 和 not null 修饰的列, 效果和 primary key 修饰的一样)
- 一个表中,只有一个主键。
- 一个主键 可以包含多个列(联合主键)。比如单单用姓名不能确定一个人。但是用姓名和班级就能确定一个人
- 在 student 表中我要把 id 设置为主键
sql
create table student(id int primary key,name varchar(20));
- 效果如下

4.1、自增主键
sql
create table 表名(列名 类型 primary key auto_increment)
- 当被 primary 修饰的列是整型时,用 auto_increment 修饰后,插入该列数据时,是空那么就会自增
- 只会根据当前表中 该列的最大值进行 加一 (系统会拿一个变量偷偷记录,即使把最大值给删了,也是按照删了的最大值进行加 1)
五、foreign key (外键约束)
sql
create table 表名(列名 类型 , foreign key (列名) references 表名(类型))
- 表和表之间的约束。一个为主表,另一个为子表。子表约束主表,主表也约束子表
- 针对子表操作,和父表关联的数据要在父表的范围之内
- 比如我有 class (class_id , class_name) 的班级表 ,和 student (student_id,student_name,student_class_id) 学生表。在 class 表中 只有 1班和 2班 和 3班,对应的 id 是123。在 student 表中的 student_class_id ,可以插入 1,2,3的数据,注意这时也能插入 4,5,6等等的数据。但是只有 123班,没有456等班。所以就需要外键约束来约束 student 表中的 student_class_id 只能是 123
sql
create table student(student_id int ,student_name varchar(20),student_class_id int ,foreign key (student_class_id) references class(class_id));
- class 为父表 约束着 子表 student
- 当student 表中 存有 1班,这时想要删除 class 中的 1班,这时是删不了的。子表也约束着父表
- 当针对子表进行插入 / 修改时,就会查询父表,看你当前的这个操作是否是合法的
- 针对父表进行删除 / 修改的时候,也会查询子表,也是要看当前的操作是否合法
- 因为上面这个行为是有查询表的过程,一条一条的数据来遍历,会很低效 。所以 MySQL 强制要求 在使用外键的时候,被关联的父表 (class)被关联的这一列(class_id),必须要带有索引
- unique 和 primary 都默认带有索引,所以目前 要使用外键,class_id 必须要 被unique 或 primary 修饰
六、check (约束)
sql
create table 表名(列名 类型 ,check(条件));
- 前面的约束虽然有用,但是用法比较单一,给程序员没有啥太多的 自定义 空间
- check 可以根据实际需要,灵活定义
- check 指定一个条件
- student 表中 的指定 genter 只有男和女
sql
create table student(id int , name varchar(20),genter varchar(1),check(genter = '男') or genter = '女');