【MySQL】表的约束

文章目录

  • 1. 表的约束概述
  • 2. 空属性 not null
  • 3. 默认值 default
  • 4. 列描述 comment
  • 5. zerofill
  • 6. 主键 primary key
  • 7. 自增长 auto_increment
  • 8. 唯一键 unique
  • 9. 外键 foreign key

1. 表的约束概述

  • 真正约束字段的是数据类型,但是数据类型约束很单一,需要一些额外的约束,来更好地保证数据的合法性,从业务逻辑角度保证数据的正确性。
  • 表的约束有很多,本篇博客主要介绍:null/not nulldefaultcommentzerofillprimarykeyauto_incrementunique key

2. 空属性 not null

  • 空属性有两个值,分别是null和not null。
  • 数据库默认字段基本都是允许为空的,但在实际开发中我们要尽可能保证字段不为空,因为空值无法参与运算。

比如通过select可以看到NULL的值为NULL。
在这里插入图片描述
但由于空值无法参与运算,所以null值加一之后得到的还是null
在这里插入图片描述

  • 站在正常的业务逻辑中,如果班级没有名字,你不知道你在哪个班级。如果教室名字为空,就不知道在哪上课。
  • 所以我们在设计数据库表的时候,一定要在表中进行限制,满足上面条件的数据就不能插入到表中,这就是“约束”。

如果要让某个字段不允许为空,在创建表的时候就可以给对应字段设置not null属性。比如我们创建一个班级表,表当中包含班级名和该班级所在的教室,如果插入数据时不想让这两个字段为空,就可以在创建表时给这两个字段设置not null属性。
在这里插入图片描述
创建完毕之后查看表结构,可以看到这两个字段是不允许为空的。
在这里插入图片描述
此时向表中插入记录时只有这两个字段都不为空时才能插入成功,否则插入失败。
在这里插入图片描述

3. 默认值 default

  • 如果某一个字段会经常性的出现某个值,那么就可以考虑将这个值设置为字段的默认值。
  • 向表中插入数据时如果不给带有默认值的字段赋值,那么就会使用默认值进行插入。

比如出现一个用户表,表中包含用户的姓名、年龄和性别,将用户的年龄默认设置为0,将用户的性别默认设置为男。如下:

比如创建一个表,表当中包含用户的姓名、年龄和性别,将用户年龄默认设置为0,性别默认设置为男。
在这里插入图片描述
创建表后查看表结构,可以发现默认值已经设置成功了。
在这里插入图片描述
此时向表中插入数据时,如果不指明用户的年龄或者性别,就会使用对应的默认值。

同时设置not null和default

  • 一旦给某一字段设置了默认值,那么该字段将不会出现空值,因为就算插入数据时没有指明该字段的值,也会使用该字段的默认值进行填充。
  • 而给某一字段设置not null属性的目的是约束该字段不能为空,因此一个字段设置了default属性后,再设置not null属性就没有意义了。

比如创建一个id表,表当中包含姓名和id,将id同时设置default和not null属性。
在这里插入图片描述
创完表之后查看表结构,可以发现id字段是不允许为空的,且其默认值为1。
在这里插入图片描述
此时在标准插入数据时可以不指明id进行插入,此时会使用id的默认值。

4. 列描述 comment

列描述:comment,没有实际含义,严格来讲也没有约束的作用,就是专门用来描述字段,它会根据表创建语句保存,用来给程序员或DBA来进行了解,。
在这里插入图片描述
通过desc查不到注释信息:
在这里插入图片描述

通过show可以看到:
在这里插入图片描述

comment要说是约束也是约束用户的行为的,在用户看到comment之后,知道该插入什么,不该插入什么。

5. zerofill

int数值类型后面的圆括号中的数字,代表的是显式宽度,对应数值类型设置zerofill属性后,如果数据的宽度小于设定的宽度则自动填充0。

比如创建一个表,表当中包含a和b两列整形数据,将它们的显示宽度都设置为5,但是没有设置zerofill属性。如下:
在这里插入图片描述
向表中插入一条记录,指明a和b的值均为1,由于我们没有给a和b字段设置zerofill属性,因此查看表中数据时显示出来的都是1,并没有显示宽度的概念。
在这里插入图片描述
修改表结构,给a列添加上zerofill属性,由于a列数据的显示宽度为5,因此查看表中数据可以看到a列数据中宽度不足5位的数据都自动在前面填充0了。
在这里插入图片描述
需要注意的是,zerofill属性的作用就是让数据以特定的方式进行显示而已,数据底层的储存方式并没有发生变化,通过hex函数可以看到a列中显示的00001在底层实际储存的还是1。
在这里插入图片描述

注:hex函数可以将一个数字变成十六进制。

6. 主键 primary key

  • 我们向表中插入一条条记录之后,为了方便后续进行查找,我们可以选择其中的某一字段作为键值key,当需要查找记录时就可以根据这个键值key来查找对应的记录。
  • 主键用来唯一地约束该字段里面的数据,表当中每条记录的主键既不能重复也不能为空,并且一张表里面只能有一个主键,此外,主键所在的列通常是整数类型。

比如创建一个学生表,表当中包含学生的学号和姓名,由于学生的学号是不会重复的,因此可以将其设置为主键。
在这里插入图片描述
创建表之后查看表结构,可以看到id对应的key出现了PRI,这表示我们已经成功将学号设置为这张表的主键了。此外,虽然在创建表的时候没有给学号设置not null属性,但由于主键本身就是不能为空的,因此id默认也就不能为空了。
在这里插入图片描述
所谓的主键约束就是,插入表中的记录的主键字段不能重复,如果插入记录的主键与表中已有记录的主键重复,这时就会因为主键冲突而插入失败。
在这里插入图片描述
使用下面图中的语句可以删除指定表的主键,因为一个表只有一个主键,因此删除主键时只用指明要删除哪种表的主键即可。比如这里删除学生表的主键后再查看表结构,可以看到id对应的key列的PRI已经没有了。
在这里插入图片描述
当表没有主键的时候,可以追加主键。
在这里插入图片描述

复合主键

  • 一张表里面只能有一个主键,但一个主键可以由多个字段来承担,这种主键就叫做复合主键。
  • 复合主键用来唯一约束多个字段里面的数据,表当中每条记录的这多个字段不能同时重复也不能为空。

比如创建一个进程表,表当中包含进程的IP地址、端口号和进程的相关信息,并将IP地址和端口号组合起来形成一个复合主键。
在这里插入图片描述
表创建完毕后查看表结构,可以看到ip和port的Key列都有PRI标志,并且它们都是不允许为空的。
在这里插入图片描述
向进程表中插入数据时,只有插入进程的IP和端口均出现冲突时才会产生主键冲突,否则就允许插入。

7. 自增长 auto_increment

  • 设置了自增长属性的字段,插入数据时如果不给该字段值,那么系统会自动找出当前字段中已有的最大值,将最大值进行加一后得到的值插入该字段。
  • 任何一个字段要做自增长,前提是其本身必须是一个索引(Key一栏有值),并且自增长字段必须是数值类型,一张表最多只能有一个自增长字段。
  • 自增长通常和主键搭配使用,作为逻辑主键。一般而言,建议将主键设计为域当前业务无关的字段,避免因为业务逻辑的调整而需要修改主键。

比如创建一个表,表当中包含id和name,将id同时设置成主键和自增长字段。

在这里插入图片描述

创建表完毕后查看表结构,可以看到id的Extra列中出现了auto_increment标志。

在这里插入图片描述

后续在插入时如果不指明自增长字段的值,那么自增长字段的值就会一直递增。

在这里插入图片描述
当然,插入记录的时候也可以指明自增长字段的值,此时将会使用该值进行插入,但注意指明的值不能和表中已有的id值重复。
在这里插入图片描述

一般自增长字段设置后就不需要手动为该字段插入值了,直接让其从1开始进行自增长即可。

8. 唯一键 unique

  • 一张表中往往有很多字段具有唯一性,但一张表只能有一个主键,而唯一键就可以解决表中有多个字段需要唯一性约束的问题。
  • 唯一键和主键都能保证字段中数据的唯一性,但唯一键允许字段为空,并且可以多个字段为空,空字段不作唯一性比较。
  • 需要注意的是,不是主键具有唯一性,而是某个具有唯一性的字段被选择成为了主键,而哪些不是主键但是同样需要唯一性约束的字段就应该设置成唯一键。

我们可以简单理解成,主键更多的是标识唯一性的,而唯一键更多的是保证在业务上,不要和别的信息出现重复。

比如创建一个学生表,表当中包含学生的id、姓名和电话号码,将我们选择id作为主键,但同时每个学生的电话号码也应该具有唯一性约束,因此应该将电话号码设置成唯一键。
在这里插入图片描述
表创建完毕后查看表结构,可以看到tel的Key列出现了UNI标志,这就表明tel已经成功被设置成唯一键了。
在这里插入图片描述

此时向表中插入记录时,如果插入记录中的电话号码与表中已有记录的电话号码出现重复,那么就会因为唯一键冲突而插入失败。

9. 外键 foreign key

  • 外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须有主键约束或unique约束。
  • 当定义外键后,要求外键列数据必须在主键的主键列存在或为null。

比如先创建一个班级表作为主表,表当中包含班级的id和班级名,并将班级id设置为主键。
在这里插入图片描述
再创建一个学生表作为从表,表当中包含学生的id、姓名以及学生所在班级对应的id,并将学生表中的班级id列设置成外键,关联到班级表中的班级id列。
在这里插入图片描述
表创建完毕后查看学生表的表结构,可以看到学生表中的班级id对应的Key列出现了MUL标志,这表明class_id已经成功被设置成了外键。
在这里插入图片描述

为了演示外键约束,我们先向班级表中插入两条记录。

在这里插入图片描述
这时向学生表中插入记录时,如果插入的记录对应的班级id是班级表中存在的,或者插入的班级id为null,那么此时是允许进行插入的,否则就不允许。这就是外键约束
在这里插入图片描述

  • 理论上来说,我们创建班级表和学生表后就算不设置外键,在语义上起始也已经有了外键,但这样我们没法保证后续插入学生表的记录中的班级id的正确性。
  • 而我们给学生表中的班级id设置为外键后,外键约束就能保证只有班级id在班级表中存在的记录才能插入学生表,否则就会插入失败。
  • 实际建立外键的本质就是把相关性交给MySQL去审核了,提前告诉MySQL表之间的约束关系,当用户插入不符合业务逻辑的数据时,MySQL就不允许你插入。

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

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

相关文章

基于微信小程序的英语互助小程序设计与实现(亮点:小组制打卡、模拟考试答题、错题本、学习论坛)

文章目录 前言系统主要功能:具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

什么是 AirServer?Mac专用投屏工具AirServer 7 .27 for Mac中文破解版百度网盘下载

AirServer 7 .27 for Mac中文免费激活版是一款Mac专用投屏工具,能够通过本地网络将音频、照片、视频以及支持AirPlay功能的第三方App,从 iOS 设备无线传送到 Mac 电脑的屏幕上,把Mac变成一个AirPlay终端的实用工具。 目前最新的AirServer 7.2…

从零开始—【Mac系统】MacOS配置Java环境变量

系统环境说明 Apple M1 macOS Ventura 版本13.5.2 1.下载JDK安装包 Oracle官网下载地址 JDK下载【注:推荐下载JDK8 Oracle官网JDK8下载】 关于JDK、JRE、JVM的关系说明 JDK(Java Development Kit,Java开发工具包) ,是整个JAVA的核心&#…

ctfshow web入门(21-28爆破)

web21 抓包 进行了base64加密,解码后发现账号和密码格式是 账号:密码 爆破 位置一开始选错了,应该是不含Basic的 模式选择custom iterator(自定义迭代器) 自定义迭代器可以自定义拼接方式 分别设置三个位置,第一个位置为admin 第二个位置…

RHCE---Linux的计划任务

文章目录 目录 文章目录 前言 一.单一执行的例行性工作 at 命令 二.循环执行的例行性工作 crontab 命令 课后作业: 思维导图 前言 如果想要让自己设计的备份程序可以自动地在系统下面运行,而不需要手动来启动它,这是该如何处理&#xff1f…

威胁追踪如何增强您的网络安全态势

网络威胁的复杂性、频率和影响正在加剧。2022 年,勒索软件攻击达到2.361 亿次,其中 39% 的英国企业遭受网络攻击。 这些攻击需要工具和资源来识别和纠正漏洞,以在云环境中维护强大的安全框架,从而降低数据泄露和合规违规的风险。…

asp.net core automapper的使用

1.安装automapper的nuget包 AutoMapper.Extensions.Microsoft.DependencyInjection 2.创建需要映射的类和转换后的类 public class studto{public int sn { get; set; }public string name { get; set; }public string sex { get; set; }public int age { get; set; }public s…

mac 配置 httpd nginx php-fpm 详细记录 已解决

在日常mac电脑 开发php项目一直是 httpd 方式 运行,由于有 多版本 运行的需求,docker不想用,索性用 php-fpm进行 功能处理。上次配置 是好的,但是感觉马马虎虎,这次 配置底朝天。因为配置服务器,几乎也都是…

List<HashMap<String,String>>实现自定义字符串排序(key排序、Value排序)

系列文章目录 SpringBootVue3实现登录验证码功能 Java实现发送邮件(定时自动发送邮件) 换个角度使用Redis去解决跨域存取Session问题 Redis缓存穿透、击穿、雪崩问题及解决方法 Spring Cache的使用–快速上手篇 更多该系列文章请查看我的主页哦 文章目录…

游戏技术亮点|Aavegotchi 与 GameSwift 建立合作伙伴关系

构建一个优秀的游戏只是成功发布的一部分,让数百万玩家体验这款游戏才是真正的乐趣所在。 这也是为什么我们很高兴宣布与 GameSwift 建立了新的合作伙伴关系,GameSwift 是一款先进的模块化游戏区块链,采用 zkEVM 技术构建,是全球…

切割VOC的图像和他的标签

切割VOC的图像 背景代码 背景 图像及对应xml文件切割 需要将图像切分为819,819的子图像 代码 import os import xml.etree.ElementTree as ET from PIL import Imagedef crop_one_image_and_xml(image_path, annotation_path, output_path, filename):# -*- coding: encoding…

[Zer0pts2020]Can you guess it? basename特性 和preg_match 绕过

直接就可以进入看看源代码 原本以为这道题目有两个方法来做 但是 后面发现第二个没有找到漏洞 这里考点主要就是 正则和 basename的特性 首先就是正则 现在出现一个知识点 就是 /index.php/config.php 这种路径 访问的还是 index.php 我们可以试试看 还是在index.php中过…

基于微信小程序的明星应援小程序设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能:具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

golang工程——常用数据结构底层原理【mao、slice、func、string】

字符串 其实就是字符数组 注意 字节数组与字符串可以相互转换 a : "hello world" b : []byte(a) c : string(b)字节数组转换为字符串在运行时调用了slicebytetostring函数。需要注意的是,字节数组与字符串的相互转换并不是简单的指针引用,…

【实战详解】如何快速搭建接口自动化测试框架?Python + Requests

摘要: 本文主要介绍如何使用Python语言和Requests库进行接口自动化测试,并提供详细的代码示例和操作步骤。希望能对读者有所启发和帮助。 前言 随着移动互联网的快速发展,越来越多的应用程序采用Web API(也称为RESTful API&…

分类预测 | Matlab实现GA-RF遗传算法优化随机森林多输入分类预测

分类预测 | Matlab实现GA-RF遗传算法优化随机森林多输入分类预测 目录 分类预测 | Matlab实现GA-RF遗传算法优化随机森林多输入分类预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现GA-RF遗传算法优化随机森林多输入分类预测(完整源码和数据&…

如何进一步全面提高项目估算精准度?

项目估算非常重要,这直接关系着项目的成本和收入,如果估算不准确,将为项目带来较大风险。一般软件规模可以用多种方式进行估算,但是用功能点估算方式更准确,而自动估算让估算更快速,我们以CoCode开发的估算…

【Go】rsrc不是内部或外部命令、无法将“rsrc”项识别为 cmdlet、函数、脚本文件或可运行程序的名称 解决方法

前言 想尝试用go创建一个桌面应用程序,然后查了下决定用 walk。 我们要先下载walk,这里 官方链接 按照官方文档,我们先用go get命令下载。 go get github.com/lxn/walk然后分别创建好了 main.go、main.manifest 文件,代码如下…

libtorch之tensor的使用

1. tensor的创建 tensor的创建有三种常用的形式,如下所示 ones创建一个指定维度,数据全为1的tensor. 例子中的维度是2维,5行3列。 torch::Tensor t torch::ones({5,3}); zeros创建一个指定维度,数据全为0的tensor,例子…

Java基于SpringBoot的民宿管理系统,附源码

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 开发环境:后端:前端:数据库: 系统架构&#xff1a…