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 = '女');
相关推荐
这个DBA有点耶41 分钟前
InnoDB页结构深入:页分裂、页合并、填充因子——B+树底层机制全解析
数据库·mysql·架构
山岚的运维笔记1 小时前
mysql 专业笔记 -- 第 36 章:MySQL 管理
运维·数据库·笔记·后端·mysql·oracle·dba
霸道流氓气质2 小时前
SQL 里的 AND / OR 优先级陷阱:一个括号引发的“数据越界“
mysql
爱奥尼欧5 小时前
【MySQL】建库就是建目录?字符集校验规则、备份恢复与alter改表实操
mysql
大虾别跑5 小时前
mysql5.7升级
mysql
geovindu6 小时前
sql: Transaction & Concurrency Patterns using mysql 9.0
mysql·数据库开发·数据库架构
敲代码的瓦龙6 小时前
Jetpack?DataBinding!!!
android·java·开发语言·mysql·android-studio
想念是会呼吸的鱼6 小时前
MySQL 常用语法整理
sql·mysql
不正经的码狗6 小时前
MySQL 免安装教程|安装不报错
mysql
旋生万物6 小时前
MySQL 死锁总复发?用螺旋事务相位互逆法定位加锁顺序(附 Python 诊断脚本)
mysql·大模型·innodb·螺旋生成论·螺旋相位