MySQL——4、表的约束

news2025/5/23 4:47:09

表的约束

  • 1、空属性
  • 2、默认值
  • 3、列描述
  • 4、zerofill
  • 5、主键
  • 6、自增长
  • 7、唯一键
  • 8、外键
  • 9、综合案例

真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。比如有一个字段是email,要求是唯一的。表的约束很多,这里主要介绍如下几个: null/not null,default,comment,zerofill,primary key,auto_increment,unique key。

1、空属性

在这里插入图片描述
使用样例:创建一个myclass表,里面应该有哪个班级和哪个教室的信息,并且这两个信息一定是不能为空的。
在这里插入图片描述
如图,我们在class_name和class_room后面添加了not null约束,所以将来在插入的时候这两列属性不能为空。desc查看表结构的手,看Null这一列,可以看到这两个属性为NO,不允许插入NULL。而另一个属性other作为对比,我们没有设置not null,所以默认可以插入NULL。

在这里插入图片描述


2、默认值

默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值。

使用样例:
在这里插入图片描述
上面我们创建了表t1,name属性设置非空约束,年龄age和性别gender设置了默认值。当将来用户如果插入对应的值,就用用户给的值,否则就采用默认值。
在这里插入图片描述

下面来看看默认值和空属性的关系:
在这里插入图片描述
在这里插入图片描述
由于name属性设置了not null约束,所以插入null是失败的。而当我们插入的时候,不制定name这一列属性,发现报错的是name这一列没有默认值。
如果我们没有明确指定一列要插入,用的是default,如果没有设置default就无法插入。

在这里插入图片描述
由于gender这一列设置的非空约束,所以我们也不能插入null。如果我们插入时不指定这一列,采用我们设置的默认值男,如果没有默认值就报错。
default和not null并不冲突,而是互相补充的。not null针对的是用户插入数据的时候,插入的是NULL还是合法数据。default针对的是用户忽略这一列的时候,使用默认值,如果没有设置默认值就直接报错。

在这里插入图片描述
当我们创建表t3,两个属性name个age,我们没有添加任何约束。然后向表中插入数据,我们并没有指定name这一列,正常来说由于没有指定,所以应该采用的是默认值,但是我们并没有设置默认值,所以应该报错,那么为什么这里没有报错了。我们查看建表时的信息,我们发现MySQL给我们做了优化,给我添加上了DEFAULT NULL,所以使用了默认值NULL。


3、列描述

列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解。

在这里插入图片描述


4、zerofill

在这里插入图片描述
如图,左侧是mysql比较老的版本,我们创建一个表t17,属性数据类型都是int,使用desc查看表结构的时候我们发现int后面跟了圆括号10。而在较新的mysql版本中已经没有显示了。那么这个圆括号10是什么意思呢?
在这里插入图片描述
首先向t5插入一行数据,然后查看,很符合我们的预期。接下来我们修改b的属性字段:
在这里插入图片描述
修改字段b的属性,添加zerofill,再次查看表结构,我们发现b这一列属性的数据类型为无符号的int(10)。再次查数据,发现b前面填充了9个0。我们再插入数据看看:
在这里插入图片描述
zerofill的作用:如果显示出来的数字位数小于括号里面的值,那么就会在前面补上0。

在这里插入图片描述
当数字位数大于括号里面的位数时正常显示,当不够时在前面补0。zerofill并不影响存储,只是影响显示的格式。


5、主键

主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键;主键所在的列通常是整数类型。

使用样例:
在这里插入图片描述
我们可以给想要添加主键的列属性在后面加上primary key字段。建好表之后desc查看表结构,我们发现Key这一列多了PRI,表示该列属性是主键。并且我们注意到,主键这一列为非空属性,我们并没有主动添加非空约束,这是MySQL优化的结果。
接着我们插入数据试试看:
在这里插入图片描述
当我们插入相同的id值时,就会报错显示主键冲突,这是因为主键不能重复,是唯一的。所以有了主键,我们就可以根据主键找到相应的信息,进行增删查改。
在这里插入图片描述
我们刚才是在建表的时候,在数据类型后面跟primary key设置主键。我们也可以建好表之后再设置主键,下面我们先去除主键再设置:
在这里插入图片描述
去除主键很简单,直接在后面跟drop primary key即可。再次查看我们发现PRI不见了。

在这里插入图片描述
一张表中只能有一个主键,并不意味着一个表中的主键只能添加给一列。一个主键可以被添加到一列或者多列上,多列上的主键我们称为复合主键。
在这里插入图片描述
上图中我们创建了表t7,让学生学号id和课程编号course_id这两列成为主键,这样id和course_id组合起来就不能重复了。
在这里插入图片描述
在上图的插入过程中,我们发现id和course_id只要有任何一个不同都可以插入成功,而如果两个相同重复了就插入失败,也就是这两个合起来作为一个主键——复合主键。


6、自增长

auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。
自增长的特点:
1、任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)。
2、自增长字段必须是整数。
3、一张表最多只能有一个自增长。

使用样例:
在这里插入图片描述
创建表t8,给id属性添加主键和自增长。

在这里插入图片描述
由于id设置了主键+自增长,所以插入的时候我们可以不指定id这一列。自动从1开始增长。

在这里插入图片描述
当我们指定插入1000之后,再次插入下次就是从1001开始了。我们通过show create table查看,可以发现有个AUTO_INCREMENT=1002,所以下次插入如果没有指定的话,自动插入1002。

基于上面的原因,我们可以创个表t9,属性一样,只不过我们在最后设置auto_increment=500,那么我们插入数据的时候不指定列,自动就从500开始自增长。
在这里插入图片描述

在插入后获取上次插入的auto_increment的值,可以使用last_select_id()。
在这里插入图片描述

有关索引:
在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。


7、唯一键

一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有多个字段需要唯一性约束的问题。
唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。关于唯一键和主键的区别:我们可以简单理解成,主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息出现重复。

在这里插入图片描述
我们在数据类型后面添加unique key,表示给该属性添加唯一键。desc查看表结构,发现对应Key这一列有UNI。

在这里插入图片描述
我们再插入的时候发现,唯一键也是具有唯一性的,重复的数据无法插入。但是唯一键可以插入NULL!而对于主键来说,数据不能重复且不能插入NULL。

在这里插入图片描述
在上面我们创建一个表用来存储学生的信息,比如学号、姓名、电话号码。
接着我们插入一些信息:
在这里插入图片描述
但是由于粗心操作,导致插入了重复的电话号码,这样就会出问题。因为我们知道电话号码每个都是不同的,具有唯一性,因此我们可以给电话号码设置唯一键,保证它具有唯一性。
所以实际上建表我们应该这样建:
在这里插入图片描述
也可以像下面这样在最后添加:
在这里插入图片描述

假设一个场景(当然,具体可能并不是这样,仅仅为了帮助大家理解)
比如在公司,我们需要一个员工管理系统,系统中有一个员工表,员工表中有两列信息,一个身份证号码,一个是员工工号,我们可以选择身份号码作为主键。而我们设计员工工号的时候,需要一种约束:而所有的员工工号都不能重复。具体指的是在公司的业务上不能重复,我们设计表的时候,需要这个约束,那么就可以将员工工号设计成为唯一键。一般而言,我们建议将主键设计成为和当前业务无关的字段,这样,当业务调整的时候,我们可以尽量不会对主键做过大的调整。
主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息出现重复。


8、外键

外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。
在这里插入图片描述

在这里插入图片描述
初识外键:
首先创建两张表,学生表student和班级表class
在这里插入图片描述
接着插入一些数据:
在这里插入图片描述
一般是现有班级才有学生,所以先插入班级信息,接着插入学生信息,student表中张三通过class_id=1与class表中id=1的通信101班级进行关联。

在这里插入图片描述
接着继续插入四条信息,前面三条都没有问题,但是最后插入田七的时候,粗心导致了田七的班级id为3。但是我们班级表中并没有id为3的班级,这肯定是有问题的,因为田七不能隶属于一个不存在的班级。所以我们需要通过一定的手段规避这样的问题。
另外还有一种情况,我们把班级表中id=1的班级信息删除了,那么在student中隶属于id=1的班级的学生还是存在的,这还是存在跟上面一样的问题。因为我们再去查找class表信息的时候已经不存在id=1的班级了。

在这里插入图片描述
所以,在目前的情况下,我们可以正常插入不存在班级id的学生信息,也可以随意的删除class中的班级信息,这是不符合逻辑的。
怎么解决呢?一个是我们程序员自己去维护,插入数据之前看看有没有存在对应的班级,删除班级前把学生表中隶属于该班级的学生全部删掉,但是这样做很麻烦。

我们刚才创建的两张表student和class是有外键之名的,class作为主表,student作为从表,从表student中有class_id与主表class中的id进行关联。而外键需要有关联和约束关系,class_id具有外键之名,因为class_id有关联关系,但是没有外键之实,因为没有约束。
什么是约束?当没有对应的班级id,那么mysql就不应该让我们进行插入操作。

所以我们删除student表,重新创建,并实现外键。
在这里插入图片描述

下面当我们插入不存在的班级id时,MySQL就不允许我们插入:
在这里插入图片描述

而当我们要删除id=1的班级信息时,也是无法删除的,因为从表student中还有学生隶属于这个班级:
在这里插入图片描述

当我们把班级隶属于id=1的学生全部删除后,再去删除id=1的班级信息就可以删除了:
在这里插入图片描述

最后,我们可以看到下面的外键前面还有constraint,表明给外键约束起名字。
在这里插入图片描述


9、综合案例

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

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

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

相关文章

新浪、京东golang一面整理

Mysql怎么去查询的,什么时候走索引,什么时候不走 微服务治理 我们要做到服务上下线对调用方无感知,熔断限流需要考虑,还要考虑监控和告警,链路追踪,安全,支持灰度发布、蓝绿部署、快速缩容扩容…

[250516] OpenAI 升级 ChatGPT:GPT-4.1 及 Mini 版上线!

目录 ChatGPT 迎来重要更新:GPT-4.1 和 GPT-4.1 mini 正式上线用户如何访问新模型?技术亮点与用户体验优化 ChatGPT 迎来重要更新:GPT-4.1 和 GPT-4.1 mini 正式上线 OpenAI 宣布在 ChatGPT 平台正式推出其最新的 AI 模型 GPT-4.1 和 GPT-4.…

【完整版】基于laravel开发的开源交易所源码|BTC交易所/ETH交易所/交易所/交易平台/撮合交易引擎

功能说明 源码简介与安装环境说明: 开源交易所,基于laravel开发的交易所 | BTC交易所 | ETH交易所 | 交易所 | 交易平台 | 撮合交易引擎。本项目有完整的撮合交易引擎源码、后台管理(后端前端)、前台(交易页面、活动页…

Android Framework学习七:Handler、Looper、Message

文章目录 简介LooperMessageMessageQueueHandlerFramework学习系列文章 简介 Looper当做一台传送装置,MessageQueue是传送带,传送带上放的是Message,Handler用于发送Message分发与接收处理。 Looper frameworks/base/core/java/android/app…

MyBatis:简化数据库操作的持久层框架

1、什么是Mybatis? MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由 apachesoftwarefoundation 迁移到了google code,由谷歌托管,并且改名为MyBatis 。 2013年11月迁移到Github。 iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框…

【001】RenPy打包安卓apk 流程源码级别分析

1. 入口在下图 2. SDK版本及代码入口 (renpy-8.3.7-sdk) 由于SDK一直在升级,本文采用 标题中的版本进行分析,整体逻辑变化不太大。 实际执行逻辑是调用的rapt 2.1 点击按钮实际执行逻辑 def AndroidIfState(state, needed, acti…

物理信息神经网络(PINNs)在悬臂梁分析中的应用研究

一、引言 物理信息神经网络(Physics-Informed Neural Networks, PINNs)是近年来兴起的一种结合深度学习与传统物理建模的创新方法。本文将探讨PINNs在悬臂梁力学分析中的应用,展示如何利用这一技术解决工程力学中的经典问题。 二、PINNs基本原理 PINNs的核心思想是…

论文浅尝 | HOLMES:面向大语言模型多跳问答的超关系知识图谱方法(ACL2024)

笔记整理:李晓彤,浙江大学硕士,研究方向为大语言模型 论文链接:https://arxiv.org/pdf/2406.06027 发表会议:ACL 2024 1. 动机 多跳问答(Multi-Hop Question Answering, MHQA)技术近年来在自然语…

jenkins使用Send build artifacts over SSH发布jar包目录配置

本测试用ruoyi-plus的代码。 1 [GitLab 自动触发 Jenkins 构建_jenkins构建触发器没有build when a change is pushed to git-CSDN博客](https://blog.csdn.net/wangyiyungw/article/details/81776972) 2 [jenkins使用Send build artifacts over SSH遇到的坑-CSDN博客](https…

uni-app小程序登录后…

前情 最近新接了一个全新项目,是类似商城的小程序项目,我负责从0开始搭建小程序,我选用的技术栈是uni-app技术栈,其中就有一个用户登录功能,小程序部分页面是需要登录才可以查看的,对于未登录的用户需要引…

【深度学习基础】从感知机到多层神经网络:模型原理、结构与计算过程全解析

【深度学习基础】从感知机到多层神经网络:模型原理、结构与计算过程全解析 1. 引言 神经网络的重要性: 作为人工智能的核心技术之一,神经网络通过模拟人脑神经元的工作机制,成为解决复杂模式识别、预测和决策任务的利器。从图像分…

解决Power BI Desktop导入Excel数据第一行不是列标题问题

选中第一行不是列标题的表→鼠标右键→选择编辑查询→进入Power Query界面→点击“将第一行用作标题”→点击左边的“关闭并应用” 第一行就提升为标题了

springboot3.x只需两步快速整合nacos作配置中心

一、下载依赖 我在网上找了各种资料&#xff0c;都是要先确定springcloud版本&#xff0c;实际操作却可能由于版本或者镜像或者maven等问题报红&#xff0c;出现各种情况。 实际只需要指定特定版本号就行&#xff0c;添加下面两个依赖 <dependency><groupId>com.…

<uniapp><vuex><状态管理>在uniapp中,如何使用vuex实现数据共享与传递?

前言 本专栏是基于uniapp实现手机端各种小功能的程序&#xff0c;并且基于各种通讯协议如http、websocekt等&#xff0c;实现手机端作为客户端&#xff08;或者是手持机、PDA等&#xff09;&#xff0c;与服务端进行数据通讯的实例开发。 发文平台 CSDN 环境配置 系统&…

数据湖和数据仓库的区别

在当今数据驱动的时代&#xff0c;企业需要处理和存储海量数据。数据湖与数据仓库作为两种主要的数据存储解决方案&#xff0c;各自有其独特的优势与适用场景。本文将客观详细地介绍数据湖与数据仓库的基本概念、核心区别、应用场景以及未来发展趋势&#xff0c;帮助读者更好地…

【论文阅读 | AAAI 2025 | FD2-Net:用于红外 - 可见光目标检测的频率驱动特征分解网络】

论文阅读 | AAAI 2025 | FD2-Net&#xff1a;用于红外 - 可见光目标检测的频率驱动特征分解网络 1.摘要&&引言2. 方法2.1总体架构2.2特征分解编码器2.3多模态重建机制2.4训练损失 3.实验3.1实验设置3.2主要结果3.3消融研究 4.结论 题目&#xff1a;FD2-Net: Frequency-…

济南国网数字化培训班学习笔记-第三组-1-电力通信传输网认知

电力通信传输网认知 电力通信基本情况 传输介质 传输介质类型&#xff08;导引与非导引&#xff09; 导引传输介质&#xff0c;如电缆、光纤&#xff1b; 非导引传输介质&#xff0c;如无线电波&#xff1b; 传输介质的选择影响信号传输质量 信号传输模式&#xff08;单工…

OAT 初始化时出错?问题可能出在 PAM 配置上|OceanBase 故障排查实践

本文作者&#xff1a;爱可生数据库工程师&#xff0c;任仲禹&#xff0c;擅长故障分析和性能优化。 背景 某客户在使用 OAT 初始化OceanBase 服务器的过程中&#xff0c;进行到 precheck 步骤时&#xff0c;遇到了如下报错信息&#xff1a; ERROR - check current session ha…

1-机器学习的基本概念

文章目录 一、机器学习的步骤Step1 - Function with unknownStep2 - Define Loss from Training DataStep3 - Optimization 二、机器学习的改进Q1 - 线性模型有一些缺点Q2 - 重新诠释机器学习的三步Q3 - 机器学习的扩展Q4 - 过拟合问题&#xff08;Overfitting&#xff09; 一、…

Hass-Panel - 开源智能家居控制面板

文章目录 ▎项目介绍&#xff1a;预览图▎主要特性安装部署Docker方式 正式版Home Assistant Addon方式详细安装方式1. Home Assistant 插件安装&#xff08;推荐&#xff09;2. Docker 安装命令功能说明 &#xff1a;3. Docker Compose 安装升级说明Docker Compose 版本升级 功…