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 = '女');
相关推荐
九皇叔叔7 小时前
《MySQL 体系架构详解:Server 层、SQL 执行流程与 InnoDB、MyISAM、MEMORY 存储引擎》
sql·mysql·架构
愤怒的苹果ext9 小时前
MySQL Shell备份恢复数据库
数据库·mysql·备份恢复·mysqlsh
超兔一体云12 小时前
MySQL索引优化实战——从慢查询到索引调优
后端·mysql
2601_9620748113 小时前
大数据-264 实时数仓 - Canal MySQL的binlog研究 存储目录 变动信息 配置MySQL
大数据·数据库·mysql
2601_9620738113 小时前
大数据-240 离线数仓 - 广告业务 测试 ADS层数据加载 DataX数据导出到 MySQL
大数据·数据库·mysql
这个DBA有点耶16 小时前
SQL:2023新特性详解:JSON_TABLE、GREATEST/LEAST、QUALIFY 到底怎么用?
数据库·sql·mysql
小王C语言16 小时前
MySQL 用户管理:创建用户、给用户授权
数据库·mysql
小镇敲码人17 小时前
【深入浅出】之Qt 事件系统实战:鼠标、键盘、滚轮、窗口与定时器事件
数据库·qt·网络协议·mysql·http
Sirens.17 小时前
MySQL数据库:索引
数据库·mysql
2601_9620725017 小时前
大数据-234 离线数仓 - 异构数据源 DataX 将数据 从 HDFS 到 MySQL
大数据·mysql·hdfs