「MySQL」数据库约束

🎇个人主页Ice_Sugar_7
🎇所属专栏数据库
🎇欢迎点赞收藏加关注哦!


所谓约束,就是在创建表时给这个表指定一些规则,后续插入、修改、删除操作都要遵循这些规则
引入规则是为了进行更强的数据校验

🍉约束类型

🍌NOT NULL

  • NOT NULL - 指示某列不能存储 NULL 值
    在这里插入图片描述

🍌UNIQUE

  • UNIQUE - 保证某列的每行必须有唯一的值,加入 unique 约束之后,后续进行插入、修改时都会先进行查询,看当前这个值是否已经存在
    在这里插入图片描述
    如果插入重复的 id 那就会报错:
    在这里插入图片描述

🍌DEFAULT

  • DEFAULT - 规定没有给列赋值时的默认值,默认情况下默认值为NULL。进行指定列插入时,没有指定到的列就会被设为默认值
    default 放在你想给默认值的列的后面
    在这里插入图片描述

🍌主键

  • PRIMARY KEY - 主键,是数据库中最重要的约束,它相当于是 NOT NULL 和 UNIQUE 的结合。用来作为一个记录的身份标识,有助于更容易更快速地找到表中的一个特定的记录。一个表中只能有一个主键
    注意:我们通常是将 xxx id(比如 student_id、class_id 这些)设为主键

语法为:

主键 数据类型 primary key;

既然主键不允许重复,那具体该怎么保证不重复呢?MySQL提供了一种机制——自增主键。主键可以通过 auto_increment 关键字来实现自增功能

在这里插入图片描述
举个例子:
在这里插入图片描述

然后关于自增的规则有一点需要注意,自增是从当前列的最大值继续递增下去,举个例子:

在这里插入图片描述

上面这个例子,就算我们再手动插个3下去,下一次照样是从9开始递增


🍌外键

  • FOREIGN KEY - 外键,保证一个表中的数据匹配另一个表中的值的参照完整性

语法:把前面所有列都定义好之后,在最后面通过 foreign key 创建外键约束
假设现在有两个表:记录学生信息的学生表(学生在几班)、记录班级信息的班级表

create table class(classId int primary key);
create table student(name varchar(10),classId int,foreign key(classId) references class(classId));

这种情况下,我们可以认为班级表约束了学生表,我们把班级表这种约束别人的表,称为父表;把学生表这种被别人约束的表,称为子表
从语法上看,我们是在创建子表时建立外键约束,其中子表需要约束的列位于foreign key后面,父表的列位于references的后面

那么外键是如何进行约束的呢?

省流:使用外键约束时,操作子表,要先查询父表;操作父表,也要先查询子表

下面我们通过一个例子来了解一下:

mysql> insert into students values('张一',1,1);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test`.`students`, CONSTRAINT `students_ibfk_1` FOREIGN KEY (`classid`) REFERENCES `class` (`id`))
# 报错,因为此时班级表中没有 id 为 1 的记录

mysql> insert into class values(1),(2),(3);
mysql> insert into students values('张一',1,1); # 插入成功


mysql> insert into student values('张一',1);  
Query OK, 1 row affected (0.00 sec)  #插入成功
mysql> insert into students values('张三',2,4); # 报错,因为班级表中没有 4 这个记录

通过上面往子表插入记录的例子我们可以得到这样的结论:引入外键约束之后,新增一个记录,就会先在对应的父表中查询,看看是否存在,如果不存在,就会报错

外键约束其实是双向的,就是说表面上看是父表约束了子表,但与此同时,子表对父表也是有约束的,比如刚才我们在班级表中创建了3个班级,现在要删除1班,就会报错

mysql> delete from class where id = 1;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`test`.`students`, CONSTRAINT `students_ibfk_1` FOREIGN KEY (`classid`) REFERENCES `class` (`id`))

尝试删除 or 修改父表中的记录时,也会先查询子表看看当前这个结果是否在子表中被引用,如果被引用,那就没法删除
要想删除父表这个记录,我们必须先删除子表中对应数据,确保子表中没有数据引用父表的记录,才能执行删除

不难看出,使用外键约束时,会伴随很多查询操作,而如果表的数据很多,那么查询就会非常低效
为了让上述查询操作更高效一些,往往需要让子表中的列和父表中被引用的列,都要带有“索引”

那这个“索引”是啥?

我们前面创建班级表的时候,将 classid 设为主键,当表里有了主键之后,就会自动创建出索引,就可以加快查询速度
注意:如果没把 classid 设为主键,那么在创建学生表使用外键约束就会报错,因为父表被引用的列得带有索引,才能被子表引用


🍌CHECK

  • CHECK - 保证列中的值符合指定的条件。对于MySQL数据库,对CHECK子句进行分析,但是忽略CHECK子句

不过MySQL并不支持这个操作,就是说我们可以写check,不会报错,但是check并没有真正生效(oracle之类就支持这种操作)

  • 28
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 29
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值