MySQL 的约束

文章目录

  • 前言
  • [一、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 = '女');
相关推荐
文人sec1 小时前
MySQL事务与索引做了什么?
android·笔记·mysql
Dear~yxy2 小时前
MySQL企业级实战
数据库·mysql
weixin_727535623 小时前
mysql高频八股问答200
sql·mysql
杨_晨4 小时前
LLM输出康熙部首冲突
数据库·python·mysql·ai
爱看报的猿4 小时前
【金仓数据库征文】MySQL至金仓KES异构数据库平滑迁移与性能深度调优实战
数据库·数据仓库·mysql·金仓数据库征文
ERD Online5 小时前
MySQL/Oracle/PG/SQLServer 存量库一键逆向成关系图
mysql·oracle·sqlserver
NeilYuen6 小时前
Mysql实战——图片读写
数据库·mysql
正在走向自律6 小时前
【金仓数据库征文】从 MySQL 迁移到金仓数据库:哈工大智能造价项目的一次信创改造实践
数据库·mysql·性能优化·国产数据库·数据库迁移·信创适配·金仓数据库征文
奇特認7 小时前
MySQL 集群技术 1.源码编译
数据库·mysql