数据库约束

ops/2025/3/14 15:33:39/

数据库约束

  • 1. NULL约束
  • 2. UNIQUE:唯一约束
  • 3. DEFAULT:默认值约束
  • 4. PRIMARY KEY:主键约束
  • 5. FOREIGN KEY:外键约束
  • 6. CHECK约束

数据库约束是关系型数据库的一个重要功能,主要作用是保证数据的正确性,也就是数据本身是否正确,关联关系是否正确。如果人工去检查数据完整性,工作量是非常大的。我们可以通过在数据库中定义一些约束,那么数据库在写入数据时,数据库就会帮我们做校验工作

1. NULL约束

  • NOT NULL:指定某一列不能存储NULL值

在默认情况下,某一列是可以写入NULL的
在这里插入图片描述

如果要把某一列规定为一个必填项,就可以使用NOT NULL来约束
在这里插入图片描述

当我们写入一条id为NULL的数据时,会报错,提示不能写入NULL值,相当于数据库帮我们做了一次校验
在这里插入图片描述

2. UNIQUE:唯一约束

  • UNIQUE:保证某列的值在整个表中不能重复出现,比如:省份证号,学号

在这里插入图片描述
不加唯一约束的时候,可能出现编号相同,但是人名不同的情况,这是不符合逻辑的。我们可以在创表的时候,在id字段后添加上唯一约束,加以限制
在这里插入图片描述


在这里插入图片描述
第二次插入同样的id字段时,就会报错,因为id字段加了唯一约束
注: NULL可以重复插入

3. DEFAULT:默认值约束

  • DEFAULT:规定没有给列赋值时的默认值

在默认情况下,字段的默认值都是NULL,我们也可以在创建表时去自定义默认值
在这里插入图片描述


比如:我们可以定义name列的默认值为‘无名氏’
在这里插入图片描述


当我们插入数据时只指定id字段,而不指定name字段时,name列就会使用默认值去填充
在这里插入图片描述


虽然指定了默认约束,但是当我们手动指定name列的值为NULL时,插入的值依然是NULL,因为这个NULL是我们自己手动指定的,用户指定的优先级要高于默认约束
在这里插入图片描述

4. PRIMARY KEY:主键约束

  • PRIMARY KEY:NOT NULL 和 UNIQUE 的结合,即主键约束的列既是非空的也是唯一的,确保某列(或两列多个列的结合)有唯一标识,有助于更容易更快速找到表中的一个特定记录

在这里插入图片描述


为id列指定了非空和唯一约束,id列被标识为了一个PRI,表示它是一个主键。当然,也可以简写成下面的形式,更简洁
在这里插入图片描述


写入数据时,两个约束同时生效
在这里插入图片描述

主键约束帮我们校验了非空和唯一,这两个校验在写入数据时对效率时有一定的影响的,但是比起不做校验来说,这个校验消耗还是可以承担的,而且主键对于索引起到了非常重要的作用,因此强烈建议为每一张表都定义一个主键


另外,一个表中是不允许有两个主键的
在这里插入图片描述


但是,一个主键可以同时包含多个列,也就是复合主键
在这里插入图片描述


在唯一校验时,只有复合主键中的所有列都相同时,才会被判定为相同
在这里插入图片描述


  • **auto_increment: ** 自增类型,表示在当前表中上一条的记录上加1既可以
    在这里插入图片描述
    这个扩展可以让数据库帮我们去维护主键的增长,不用程序员自己去计算了,在插入的时候,先找到最大值,然后在这个基础上加1,生成一个新的值,作为新一个数据行主键的值

当设置了自增主键之后,发现写入NULL时,也可以成功插入数据,这里并不是说把这个NULL写入了数据库,而是说让数据库帮我们去处理这个列的值(自增操作)
在这里插入图片描述


当指定列插入时,也会自动生成ID,作为数据行的主键
在这里插入图片描述


当然,我们也可以去指定一个主键值,只要主键值不重复即可
在这里插入图片描述


现在,我们再尝试不指定id列,去插入一条新的数据行
在这里插入图片描述
我们发现,自增是在最大值的基础上加1,因此,主键值在数据表中可能是不连续的

5. FOREIGN KEY:外键约束

  • FOREIGN KEY:保证一个表中的数据匹配另一个表的值的参照完整性
    在这里插入图片描述
    表中外键对应的列的值,必须是另一张表中主键列的值,或是唯一约束列,也就是当前表中的值在另一张表中必须存在,且满足主键或唯一约束

我们先试着不使用外键,去创建这两张表
在这里插入图片描述


当我们去写入一条新的学生记录时,设置了不存在的班级编号,数据行依然可以写入成功
在这里插入图片描述
这是不符合要求的,因为class表中并不存在这个班级。为了使student表里的class_id字段与class表中的id字段建立关联关系,可以对student表里的class_id列使用外键约束


语法:foreign key (字段名) reference 主表(列)

在这里插入图片描述
在这里插入图片描述


这时,去插入合理的数据是可以成功的
在这里插入图片描述


如果去插入不合理的数据,就会报错
在这里插入图片描述


另外,如果这时去插入正确的数据行,会发现id是3,而不是2。这是因为虽然上一条记录未能插入成功,id字段已经自增了,因此再次去插入数据行,id是2 + 1
在这里插入图片描述


综上所述,我们可以通过外键约束,保证数据的完整性和关系的正确性


在这里插入图片描述
当子表中存在对主表的依赖时,能否去删除主表中想应的记录?答案是否定的,如果这样去删除,会报一个主外键关系的错误
在这里插入图片描述


如果要删除主表中的记录,子表中不能有对该条记录的依赖,也就意味着要先删除子表中的记录,再去删除主表中的记录

在这里插入图片描述

6. CHECK约束

  • CHECK:保证列中的值符合指定的条件。对于MySQL数据库,使用时不报错,就忽略这条约束

CHECK约束在MySQL8.0中是生效的,而在MySQL5.7中是不生效的

在这里插入图片描述
在这里插入图片描述


http://www.ppmy.cn/ops/165697.html

相关文章

【每日学点HarmonyOS Next知识】自定义对象传参、页面生命周期、自定义弹窗、路由打开对话框,网络图片

1、HarmonyOS 如何方便的自定义对象传参数? 如何方便的自定义对象传参数 在ArkTS语法中对于字典是有约束的,使用map只能通过set的方式在ArkTS中,对象的属性名不能为数字或字符串。例外:ArkTS支持属性名为字符串字面量和枚举中的…

AI智能导航站HTML5自适应源码帝国cms7.5模板

源码名称:AI导航站HTML5自适应源码帝国cms7.5模板 开发环境:帝国cms 7.5 安装环境:phpmysql var code "4d33ef8e-9e38-43b9-b37b-38f75944ecc9" 带软件采集,可以挂着自动采集发布,无需人工操作&#xff0…

【Godot4.0】贝塞尔曲线在游戏中的实际应用

概述 之前研究贝塞尔曲线绘制,完全是以绘图函数,以及实现节点连接为思考。并没有实际考虑贝塞尔曲线在游戏中的应用。今日偶然看到悦千简一年多前发的一个用贝塞尔曲线实现追踪弹或箭矢效果,还有玩物不丧志的老李杀戮尖塔系列中的卡牌动态箭…

电子电气架构 ---常见车规MCU安全启动方案

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…

Linux中grep、sed和awk常见用法总结

1.概述 Linux系统下,grep、sed和awk三个命令是最常用的、非常强大的文本处理工具,可以用于搜索、替换、过滤、排序等多种操作,掌握这三种工具的用法,可以大大提高我们在Linux下处理文本的效率。 2.grep命令 grep是一种非常常见…

嵌入式学习L6网络编程D3TCP

TCP编程 写代码 第一步socket 绑定 先填充 点分十进制转换成32位整数 client 然后就连接成功了就可以读写数据了 client #include "net.h"int main (void) {int fd -1;struct sockaddr_in sin;/* 1. 创建socket fd */if ((fd socket (AF_INET, SOCK_S…

2025-3-12 leetcode刷题情况(贪心算法--区间问题)

一、452.用最少数量的箭引爆气球 1.题目描述 2.代码 3.思路 使用 Arrays.sort 方法对 points 数组按照气球的起始坐标进行排序。这里使用 Integer.compare(a[0], b[0]) 作为比较器,确保气球按起始坐标从小到大排列。将箭的数量 count 初始化为 1,因为至…

从零开始的python学习(五)P75+P76+P77+P78+P79+P80

本文章记录观看B站python教程学习笔记和实践感悟,视频链接:【花了2万多买的Python教程全套,现在分享给大家,入门到精通(Python全栈开发教程)】 https://www.bilibili.com/video/BV1wD4y1o7AS/?p6&share_sourcecopy_web&v…