MySQL —— 约束

news2024/9/25 12:24:36

MySQL —— 约束

  • 引言
  • not null
  • unique
  • primary key —— 主键
    • auto_increment
    • 复合主键
  • foreign key —— 外键
    • 插入数据
    • 删除主表的数据
  • default

引言

在设计表的时候,有些列是必填项(如果用户不填,那这个数据就没有必要存进数据库),可能表的第一列就是编号需要能自动帮我们排序(这样可以减少用户的填写负担,也减少我们的工作量),又或者我们需要有些数据是不能重复填写的(例如身份证号,每一个人都是独一无二的)等等… 这些需求其实都可以实现,现在我们来学习数据库是如何实现约束的。

not null

表示某一列是不能存储 null 值的,也就是这一列是必填项:

格式:在你定义表的时候,在需要不为空的列旁边加上 not null 即可

在这里插入图片描述

我们查看表结构发现 Null 那一列的 id 对应的一行现实 No ,说明定义成功,现在我们插入一个 id 为 空的数据实验一下:

在这里插入图片描述

会发现不允许你插入 id 为空的数据。

unique

保证某列的每一行都有一个唯一值,即不可以在某列上出现重复的数据

语法格式:在你定义表的时候,在需要的列旁边加上 unique 即可

在这里插入图片描述

我们来查看表结构:

在这里插入图片描述
我们发现 id 那一行的 Key 值被置为了 UNI ,说明 id 是唯一值,如果插入id 相同的数据,数据库会报错:

在这里插入图片描述


null 是可以重复的,不受 unique 约束

在这里插入图片描述

primary key —— 主键

primary key(也被我们称为主键) 是 not null 和 unique 的结合(即主键约束的列即是非空的也是唯一的),能确保某列(或者两列及以上的列的组合) 有唯一的标识。

我们可以使用 not null + unique (没有顺序之分)来创建主键:

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

Key 显示 PRI 就是主键的意思


当然这里可以直接使用关键字 primary key 来定义主键 :

在这里插入图片描述

主键约束帮我们对非空和唯一值进行了校验,对于这个性能消耗来说,我们还是能接受的。


auto_increment

对于整数类型的主键,常配搭自增长auto_increment来使用。插入数据对应字段不给值时,数据库使用最大值+1 对其进行赋值

语法格式就是在主键后面加 auto_increment

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

我们查看表结构可以看到 Extra 这个扩展列表里出现了 auto_increment ,说明 id 这一列数据会自增,其实可以类比我们的excel 表格,现在给大家演示自增的现象:

在这里插入图片描述


数据库会帮我们维护主键的增长,在插入的时候,找到目前的最大值,然后在这个基础上 +1 即可。

我们在插入一个id 定义为 100 的数据,然后再插入只有姓名的数据,看看现象:

在这里插入图片描述

在这里插入图片描述

这里说明了主键可以是不连续的


现在我们清空 test 表中的所有数据,如果我们第一个插入的数据的 id 值为 null ,数据库其实也能帮我们插入进去:

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

empty set 表示空集。

这个 id 生成的数值是上次 id 的最大值加 1 。


现在我们来定义一个新的表,来试一下 第一个插入的数据的 id 值为 null:

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

如果是全新的表,插入第一个数据的主键值为 null,会自动赋值为 1
如果后序还是插入主键值为 null 的数据,数据库会为其赋值为最大值加 1

在这里插入图片描述

复合主键

注意一个表中只能存在一个主键

但是一个主键可以同时包含很多个列,这就是复合主键

如何定义符合主键?
在创建表的时候,加上 primary key (列名,列名…)

在这里插入图片描述

通过查看表结构可以看到两个列被主键管理着:

在这里插入图片描述


复合主键在做非空校验的时候,所有被主键管理的列都不能被定义为空,但是在做唯一性检验的时候,只有当所有被主键管理的列的数值都相同时,才不会被允许插入。

演示一下:

现在插入两个数据:
在这里插入图片描述

再插入主键值相同的张三数据:
在这里插入图片描述
发现插入不了,因为 1, 张三 被主键唯一值校验发现,无法插入

但是你可以插入,主键值不完全相同的张三数据:
在这里插入图片描述

foreign key —— 外键

外键用于关联其他表的主键或唯一键

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

设置外键的语法格式:foreign key (字段名) references 主表(列)

foreign key 是外键的关键字,字段名是表实当前表中哪个字段要与主表建立主外键关系,references 关键字,表实后面要引用哪个表中的哪个列。

演示:

create table class (
	id int primary key comment '班级',
	num int comment '人数'
);

create table student (
  	id bigint primary key comment '学号',
  	name varchar(50) comment '姓名',
	class_id int comment '班级',
	foreign key (class_id) references class(id)
);

注意被关联的表要先创建好,然后才能创建与其构建主外键关系的表

外键一定是关联另一张表的主键的

插入数据

在这里插入图片描述

我们往 student 表中 插入 一个不存在的班级编号的数据:
在这里插入图片描述
发现这是不能插入的

通过外键的约束,可以保证数据的完整性和关系的确定性。

删除主表的数据

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

首先先确定 class 是主表,因为它是被关联的,student 是 子表

当子表存在对主表依赖的数据的时候,不能删除主表对应的数据
在这里插入图片描述
因为 231 与子表存在关联,所以主表的 231 数据不能被删除

但是可以删除没有关联关系的数据
在这里插入图片描述

如果一定要删除主表的存在关联关系的数据的时候,那么子表就不能存在有数据行对其有依赖,所以先删除子表的数据行解除关联关系,再去删除主表的数据:
在这里插入图片描述

default

给没有赋值的列 赋默认值。

语法格式:在你定义表的时候,在指定的列旁边加上 (default + 默认值) 即可

在这里插入图片描述

查看表结构发现 Default 列表对应的 name 出现了 默认值为 无名氏,也就是当你没有填姓名的时候默认值会默认为 无名氏。

在这里插入图片描述

演示一下:

如果你有设置name 这个数值,那就不会赋默认值

在这里插入图片描述


如果你没有设置name 这个数值,就会赋默认值——无名氏:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1989148.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GPT-5:未来已来,你准备好了吗?

GPT-5 一年半后发布?对此你有何期待? IT之家6月22日消息,在美国达特茅斯工程学院周四公布的采访中,OpenAI首席技术官米拉穆拉蒂被问及GPT-5是否会在明年发布,给出了肯定答案并表示将在一年半后发布。此外,穆…

基于STM32的智能宠物喂食器

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 初始化代码控制代码应用场景 宠物定时喂食远程控制喂食常见问题及解决方案 常见问题解决方案结论 1. 引言 智能宠物喂食器可以通过定时和远程控制,实现对宠物的科学喂养。本文将…

对抗生成:基于CycleGAN的风格迁移

对抗生成:基于CycleGAN的风格迁移 前言相关介绍CycleGAN 的工作原理核心思想主要组件训练目标 优点缺点应用实例总结 实验环境项目地址LinuxWindows 项目结构具体用法准备数据(以vangogh2photo为例)进行训练(以vangogh2photo为例&…

【vulhub靶场之spring】——

简介: Spring是Java EE编程领域的一个轻量级开源框架,该框架由一个叫Rod Johnson的程序员在2002年最早提出并随后创建,是为了解决企业级编程开发中的复杂性,业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思…

Shiro框架漏洞复现(附修复方法)

Apache Shiro是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理等功能。Shiro框架直观、易用,同时也能提供健壮的安全性。 在Shiro框架下,用户登陆成功后会生成一个经过加密的Cookie。其Cookie的Key的值为RememberMe&#xff0…

用Python实现超精准识别图片中的文字,零基础小白也能轻松学会!

将图片中的文字转换成可编辑的文本(通常称为光学字符识别,Optical Character Recognition, OCR)可以通过Python的一些库来实现。一个流行的OCR库是Tesseract-OCR,它可以通过Python的pytesseract库来调用。首先,你需要在…

【全国大学生电子设计竞赛】2021年B题

🥰🥰全国大学生电子设计大赛学习资料专栏已开启,限时免费,速速收藏~

3D,从无知到无畏

欢迎来到 PaQiuQiu 的空间 本文为【3D,从无知到无畏专栏目录】,方便大家更好的阅读! 🚀~写在前面~ 近年来,3D视觉技术在众多领域飞速发展,除了智能机器人、自动驾驶、无人机等无人系统,在我们身边的AR、VR…

Nuxt2:强制删除window.__NUXT__中的数据

一、问题描述 在以前的一篇文章《Nuxt3: 强制删除__NUXT_DATA__的一种方式》中曾介绍了在Nuxt3中如何删除存在于页面id为__NUXT_DATA__的script节点中的数据。 此次,Nuxt2与Nuxt3不同在于它的数据是存在于window.__NUXT__,那么该如何处理呢?…

Python 动态进度条实现,多个实例来展示实现方式

目录 1. 使用 print 函数 2. 使用 tqdm 库 3. 自定义样式 4. 多进度条 5. 嵌套进度条 6. 更新频率控制 7. 动态描述 8. 自定义回调 9. 使用 click 库 10. 使用 rich 库 文末福利 文末赠免费精品编程资料~~ 在编写Python脚本时,特别是在处理长时间运行的…

PDF Guru Anki:一款以PDF为中心的多功能办公学习工具箱

PDF Guru Anki 是一个假想的工具箱,因为目前我没有关于这个具体产品的详细信息。但是,根据这个名字和一般的PDF工具箱功能,我可以想象一些可能的独特功能,这些功能可以包括: PDF 阅读器:提供高效的PDF阅读…

linux下的C++程序

1.安装g编译环境(c)、gcc编译环境(c语言) sudo yum install gcc或者gcc-c //安装gcc/g编译(用管理员权限弄) 验证是否安装成功 gcc或者g --version //如果显示版本号,则表示安装成功 sudo yum remove g…

Go语言fmt包中print相关方法

Go语言的fmt包提供了多种打印相关的函数,主要用于在控制台或其他输出目标上格式化并输出数据。下面是一些常用的print相关方法的用途和区别: 1.fmt.Print() 功能: fmt.Print() 将参数的内容按默认格式输出到标准输出(通常是控制台&#xff…

springcloud loadbalancer nacos无损发布

前言 故事背景 jenkins部署时总是会有几秒钟接口调用报错,观察日志是因为流量被下发到已下线的服务,重启脚本在停止应用之前先调用nacos注销实例api后再重启依然会短暂出现此问题。项目架构是springcloud alibaba,通过openfeign进行微服务之间调用&…

npm vs pnpm 之幽灵依赖

在之前的文章📄 果断放弃npm切换到pnpm–节约磁盘空间(256G硬盘救星) 中有提及 npm 扁平化带来的幽灵👻依赖 问题,但没有特别展开,这段时间实际业务中遇到了该问题,特整理如下: ♨️…

Linux C 程序 【03】线程栈空间

1.开发背景 上一个篇章创建了线程,参考 FreeRTOS,每个线程都是有自己的内存空间,Linux上面也是一样的,这个篇章主要描述线程栈空间的设置。 2.开发需求 设计实验: 1)创建线程,并配置线程内存大…

充电桩--直流充电桩方案详解

一、直流充电桩介绍 1、直流充电桩介绍 电动汽车市场数量的不断激增,为缓解消费者对其里程焦虑与充电焦虑,配置双向OBC可以实现快速充电,还可将电动汽车当作分布式储能站回馈电网帮助消峰填谷,通过DCFC为电动汽车高效充电&#…

【解决错误】ModuleNotFoundError: No module named ‘progress’

【解决错误】ModuleNotFoundError: No module named ‘progress’ 在Python编程中,遇到“ModuleNotFoundError: No module named ‘progress’”这类错误,通常意味着Python解释器在其环境中找不到名为‘progress’的模块。以下将深入探讨这一错误的产生…

HBM2、HBM2E、HBM3和HBM3E技术

HBM(High Bandwidth Memory)是一种高性能的内存技术,主要用于数据中心、超级计算机、高端服务器、图形处理器(GPU)和AI加速器等领域,因为它能够提供比传统DDR内存更高的带宽和更低的功耗。 HBM2、HBM2E、HBM3和HBM3E技术 HBM2 (High Bandwidth Memory 2) HBM2 是HBM技术…

深入JVM:类加载器和双亲委派模型

目录 1. 什么是类加载器2. 类加载器的类型3. 双亲委派模型4. 类装载的过程加载验证准备解析初始化使用卸载 1. 什么是类加载器 如果想要了解什么是类加载器就需要清楚一个Java文件是如何运行的。我们可以看下图: 首先要知道操作系统是不能直接运行Java文件的&#…