当前位置: 首页 > news >正文

[MySQL] — 数据类型和表的约束

目录

数据类型

数据类型分类

数值类型

  tinyint类型

  bit类型

  小数类型

 float

 decimal

  字符串类型

 char

 varchar

 char和varchar的区别

日期和时间类型

enum 和 set

表的约束

空属性

默认值 

列描述

zeorfill

主键

创建表时在字段上指定主键

删除主键:

追加主键属性

复合主键

自增长

唯一键

外键


 

数据类型

 数据类型分类

数值类型

  tinyint类型

在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的。字段类型加了UNSIGNED来说明该字段是无符号的。

以tinyint举例,可以看到tinyint类型是有取值范围的,如果插入的数超过了取值范围会出现什么情况呢?

 其他的整数类型也基本如此。

注意:加不加unsigned也要分场景,如有些数(年龄)不能为负数的场景就可以加,但是加不加都行的场景下尽量不加unsigned,对于int类型可能存放不下的数据,int unsigned同样可能存放不下,与其如此,还不如设计时,将int类型提升为bigint类型。但是这里并不是说无脑选最大,而是根据场景去选择类型,如果无脑选最大,每条数据都浪费一点空间,在数据量超大的情况下,存储空间就会不够用。

正常在C/C++语言中往char类型中插入一个很大的数,往往会发生数据截断或类型提升。而在MySQL这里插入超范围的值会插入失败且直接报错。反过来讲,也就是说MySQL这里只要插入成功,那么数据一定是合法的。所以在MySQL中数据类型本身一是一种约束,这个约束主要是约束使用者,倒逼着使用者进行正确的插入,如果使用者是小白,也能很好的保证数据的合法性。

为什么这里不像C/C++那样呢?因为如果发生数据截断,那么数据库中可能会因为截断而导致两个数据相同,那么此时如何辨别这两条数据呢?辨别不了,所以为了保证数据插入时的合法性,所设置的一个约束。

  bit类型

bit[(M)] : 位字段类型,M表示每个值的位数,范围从1到64。如果M被忽略,默认为1。

使用:

 当然创建表时bit的位数也不能超过最大值,超过会创建失败。

   小数类型

      float

float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节

 如果不指定显示长度和小数位数,默认的精度会很大。

float(4,2)表示的范围是-99.99 ~ 99.99,MySQL在保存值时会进行四舍五入。

使用: 

如果加上unsigned, 这时,因为把它指定为无符号的数,它的范围是 0 ~ 99.99 。

 decimal

decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数。

decimal和float很像,表示范围基本相同,但是他两有区别:float和decimal表示的精度不一样。如果需要较高的精度,推荐使用decimal。

使用: 

float表示的精度大约是7位,decimal整数最大位数m为65,支持小数最大位数d是30。如果d被省略,默认为0,如果m被省略,默认是10。这个默认值可能会随着MySQL的版本不同而不同。
 

  字符串类型

   char

char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255。

创建表时,char类型的长度超过255,就会创建失败。

char(L)表示可以存放L个字符,可以是字母或汉字,但是不能超过L个, 最多只能是255。

使用: 

    varchar

varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节。

使用:

 这里我们发现最大长度不是65535吗,怎么这里变成21845了?

65535是字节,这里表示的是最大长度的字符。

 

关于varchar(len),len到底是多大,这个len值,和表的编码密切相关:

这个varchar,就像是C中的变长数组,你用多少,就给你分配多少,但是最长不超过你设定的长度。varchar字节长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字节数是65532。

当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844[因为utf中,一个字符占
用3个字节],如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符
占用2字节)。

  char和varchar的区别

 如何选择char和varchar?

  • 如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5;
  • 如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去;
  • 定长的磁盘空间比较浪费,但是效率高;
  • 变长的磁盘空间比较节省,但是效率低;
  • 定长的意义是,直接开辟好对应的空间;
  • 变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少。

日期和时间类型

常用的日期有如下三个:

  • date:日期 'yyyy-mm-dd' ,占用三字节;
  • datetime: 时间日期 格式 'yyyy-mm-dd HH:ii:ss' 表示范围从 1000 到 9999 ,占用八字节;
  • timestamp:时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字节。

使用: 

enum 和 set

enum:枚举,“单选”类型;enum('选项1','选项2','选项3',...);

该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,....最多65535个;当我们添加枚举值时,也可以添加对应的数字编号。

set:集合,“多选”类型;set('选项值1','选项值2','选项值3', ...);

该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值;而且出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,.... 最多64个。

使用:

  我们想要从数据中进行查找:所有去过北京的人

 这里并不能查找出所有去过北京的人。

集合查询推荐使用find_ in_ set函数:

find_in_set(sub,str_list) :如果 sub 在 str_list 中,则返回下标;如果不在,返回0;str_list 用逗号分隔的字符串。

 

表的约束

真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。本质还是通过技术手段,约束使用者插入正确的数据。

表的约束很多,这里主要介绍如下几个: null/not null、default、comment、zerofill、primarykey、auto_increment、unique key 。
 

空属性

有两个值:null(默认的)和not null(不为空)。。

数据库默认字段基本都是为空,但是在实际开发时,要尽可能保证字段不为空,因为数据为空没办
法参与运算。

使用非空约束:

创建一个班级表,表内包含班级的名字、班级所在的教室和班级说明。

正常看来一个班级不能没有名字,班级也不能没有教室。

所以在设计时表明班级名和班级教室不能为空,为空就不能插入,这就是“约束”。

默认值 

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

使用:

default和 NOT NULL 这两个并不冲突,而是互相补充的。

  • NOT NULL 约束的是用户插入时,只有插入合法数据也就是不为空的数据。
  • default 约束的是用户忽略某一项时,如果有默认值就使用默认值,如果没有默认值直接报错。

那有人会说不对呀,我使用的时候,我也没指定某一项不能为空,也没有指定默认值,但是我插入时忽略该项也没有报错呀。如下图

那是因为在创建表的时候,MySQL默认给我们添加了default 为NULL的信息 。就像上图查看表信息的时候defaul类型就会有一个NULL,而如果你指定了某一项不能为空的信息,MySQL则就不会添加default 为NULL的信息了。

列描述

列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解。说白了就是注释,属于一种软性约束,给使用者看的,让使用者自发的根据描述去插入数据。

zeorfill

其实没有 zerofill 这个属性, 括号内的数字是毫无意义的,你正常插入数字,他也会正常显示。

但是添加了 zerofill 属性 ,显示结果就不一样了,这里我们修改表内b的属性。

可以看到b的值在前面填充了0,这就是zerofill的属性,如果宽度小于设定的宽度,自动填充0,如果宽度大于设定值则正常显示。

要注意的是,这只是最后显示的结果,在MySQL中实际存储的还是正常的值,只是设置了zerofill属性后的一种格式化输出而已,查找的话也没问题。

这里还有一个细节需要注意:int类型创建时默认是11位,而加了unsigned的int却是10位为什么呢?

我们知道 有符号 int 的值区间是 -21亿多 ~ 21亿多,而无符号 int 是0 ~ 42亿多,这两个的值10位数就可以全部覆盖,而有符号 int 有负号所以多加1位。

 主键

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

使用:

创建表时在字段上指定主键

主键不能重复,重复会插入失败。

删除主键:

 删除掉主键属性后,id就可以重复了。

 追加主键属性

主键属性最好是创建表的时候就指定,或者刚开始使用的时候指定,别等用了很久以后才指定,这个时候,你说你删那条数据呢?

 复合主键

前面说过主键一个表最多只能有一个,这不意味着一个表的主键只能添加给一个字段,一个主键可以给一个字段添加,也可以给多个字段添加,这样的我们称为复合主键。

自增长

auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。

自增长的特点:

  • 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
  • 自增长字段必须是整数
  • 一张表最多只能有一个自增长

使用:

自增默认从1开始。

 自己指定插入也可以,但是自增会从最新的位置开始。

如果添加自增属性的不是主键会报错。

也可以自己指定从哪里开始自增。 

索引:

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

唯一键

unique key:一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键,那么唯一键就可以解决表中有多个字段需要唯一性约束的问题。

唯一键的本质和主键差不多都是保证唯一性,但是唯一键允许为空,而且可以多个为空,因为空字段不做唯一性比较。

关于唯一键和主键的区别:
我们可以简单理解成,主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息出现重复。它们两个是不冲突的,是属于互补的。

 就像上面的例子,主键保证学号的唯一性,因为名字可能会重复,所以保证不为空就行,而电话基本每个人单独有自己的,且电话号码并不会重复,所以电话号码就需要保证唯一性,否则如果粗心让两个人的电话相同,那么在查询时,你能否知道这个电话号码是谁的吗? 并不知道,那么有人会说电话都可以为空了,这没有问题吗?当然你也可以在创建时将电话那列的属性加上NOT NULL属性,此时唯一键的功能就和主键一样了,但是他们两负责的内容是不同的,主键负责记录的唯一性,唯一键负责业务上,不要出现信息重复。

 一般而言,我们建议将主键设计成为和当前业务无关的字段,这样,当业务调整的时候,我们可以尽量不会对主键做过大的调整。

外键

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

foreign key (字段名) references 主表(列)

 使用:

 

如何理解外键约束?

        首先我们承认,这个世界是数据很多都是相关性的。理论上,上面的例子,我们不创建外键约束,就正常建立学生表,以及班级表,该有的字段我们都有。但是,在实际使用的时候,可能会出现什么问题?有没有可能插入的学生信息中有具体的班级,但是该班级却没有在班级表中?

        比如某个学校高三只开了101班,102班,但是在上课的学生里面竟然有高三103班的学生(这个班目前并不存在),这很明显是有问题的。因为此时两张表在业务上是有相关性的,但是在业务上没有建立约束关系,那么就可能出现问题。

        解决方案就是通过外键完成的。建立外键的本质其实就是把相关性交给mysql去审核了,提前告诉mysql表之间的约束关系,那么当用户插入不符合业务逻辑的数据的时候,mysql不允许你插入。

相关文章:

[MySQL] — 数据类型和表的约束

目录 数据类型 数据类型分类 数值类型 tinyint类型 bit类型 小数类型 float decimal 字符串类型 char varchar char和varchar的区别 日期和时间类型 enum 和 set 表的约束 空属性 默认值 列描述 zeorfill 主键 创建表时在字段上指定主键 删除主键: 追…...

JetBrains IDE远程开发功能可供GitHub用户使用

JetBrains与GitHub去年已达成合作,提供GitHub Codespaces 与 JetBrains Gateway 之间的集成。 GitHub Codespaces允许用户创建安全、可配置、专属的云端开发环境,此集成意味着您可以通过JetBrains Gateway使用在 GitHub Codespaces 中运行喜欢的IDE进行…...

LVS 负载均衡集群

集群 集群(Cluster)是一组相互连接的计算机或服务器,它们通过网络一起工作以完成共同的任务或提供服务。集群的目标是通过将多台计算机协同工作,提高计算能力、可用性、性能和可伸缩性,适用于大量高并发的场景。 集群…...

Mongodb Ubuntu安装

Mongodb Ubuntu安装 1.更新软件源导入MongoDB的GPG密钥 sudo apt update sudo apt install -y dirmngr wget gnupg apt-transport-https ca-certificates software-properties-common gnupgwget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add…...

【Spring Boot 源码学习】自动装配流程源码解析(下)

自动装配流程源码解析(下) 引言往期内容主要内容4. 排除指定自动配置组件5. 过滤自动配置组件6. 触发自动配置事件 总结 引言 上篇博文,笔者带大家了解了自动装配流程中有关自动配置加载的流程; 本篇将介绍自动装配流程剩余的内…...

基于微信小程序的毕业设计题目200例

个人简介:7 年大厂程序员经历,擅长Java、微信小程序、Python、Android等,大家有这一块的问题可以一起交流! 各类成品 java毕设 。javaweb,ssh,ssm,springboot等等项目框架,源码丰富&…...

【数据管理】什么是数据管理?

文章目录 前言常见内容主题领域数据类型元数据引用数据主数据交易数据 数据类型的特点数据类型之间的关系GIGO数据质量评估 数据质量管理数据治理数据安全 前言 数据管理,即对数据资源的管理。按照 DAMA (国际数据管理协会)的定义&#xff1…...

[oneAPI] 手写数字识别-LSTM

[oneAPI] 手写数字识别-LSTM 手写数字识别参数与包加载数据模型训练过程结果 oneAPI 比赛:https://marketing.csdn.net/p/f3e44fbfe46c465f4d9d6c23e38e0517 Intel DevCloud for oneAPI:https://devcloud.intel.com/oneapi/get_started/aiAnalyticsToolk…...

通过css设置filter 属性,使整个页面呈现灰度效果,让整个网页变灰

通过css设置filter 属性设置页面整体置灰 效果图: 通过设置 filter 属性为 grayscale(100%)&#xff0c;页面中的所有元素都会被应用灰色滤镜效果&#xff0c;使整个页面呈现灰度效果。 <style type"text/css"> html { filter: grayscale(100%); -webkit-f…...

ahooks.js:一款强大的React Hooks库及其API使用教程(一)

一、ahooks.js简介二、ahooks.js安装三、ahooks.js API介绍与使用教程1. useRequest2. useAntdTable3. useSize4. useBoolean5. useToggle6. useHover7. useDebounce8. useEventListener9. useFusionTable10. useKeyPress11. useLoading12. usePrevious13. useForm14. useUpdat…...

拟合圆算法源码(商业)

1、输入一些点 2、执行fitCircle算法 3、输出圆心(x,y)及半径r Box fitCircle(const std::vector<cv::Point2f>& points) {Box box;box.x = 0.0f;box.y = 0.0f;box.r = 0.0f;if (points.size() < 3){return box;}int i = 0;double X1 = 0;double Y1 = 0;doubl…...

第一章 IRIS 编程简介

文章目录 第一章 IRIS 编程简介简介ClassesRoutines 第一章 IRIS 编程简介 简介 IRIS 是一个高性能多模型数据平台&#xff0c;具有内置的通用编程语言 ObjectScript&#xff0c;以及对 Python 的内置支持。 IRIS 支持多进程并提供并发控制。每个进程都可以直接、高效地访问…...

Leetcode-每日一题【剑指 Offer 32 - III. 从上到下打印二叉树 III】

题目 请实现一个函数按照之字形顺序打印二叉树&#xff0c;即第一行按照从左到右的顺序打印&#xff0c;第二层按照从右到左的顺序打印&#xff0c;第三行再按照从左到右的顺序打印&#xff0c;其他行以此类推。 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20…...

.NET应用UI组件DevExpress XAF v23.1 - 全新的日程模块

DevExpress XAF是一款强大的现代应用程序框架&#xff0c;允许同时开发ASP.NET和WinForms。DevExpress XAF采用模块化设计&#xff0c;开发人员可以选择内建模块&#xff0c;也可以自行创建&#xff0c;从而以更快的速度和比开发人员当前更强有力的方式创建应用程序。 在新版中…...

UBuntu18.04 Qt之双HDMI屏切换

UBuntu18.04 Qt之双HDMI接2个4K屏并分别设置分辨率、主屏、副屏 一、设置HDMI-2为主屏 在main函数里面添加&#xff1a; #include "mainwindow.h" #include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);{long nTotal 0;c…...

c#配置提供者

在 C# 中,配置系统是一种用于管理应用程序配置数据的机制。通常情况下,应用程序的配置数据包括连接字符串、应用程序设置、环境变量等。C# 配置系统允许您轻松地读取和使用这些配置数据,而不需要硬编码在代码中。 除了默认的配置提供者外,C# 配置系统还支持其他配置提供者…...

python rtsp 硬件解码 二

上次使用了python的opencv模块 述说了使用PyNvCodec 模块&#xff0c;这个模块本身并没有rtsp的读写&#xff0c;那么读写rtsp是可以使用很多方法的&#xff0c;我们为了输出到pytorch直接使用AI程序&#xff0c;简化rtsp 输入&#xff0c;可以直接使用ffmpeg的子进程 方法一 …...

搭载KaihongOS的工业平板、机器人、无人机等产品通过3.2版本兼容性测评,持续繁荣OpenHarmony生态

近日&#xff0c;搭载深圳开鸿数字产业发展有限公司&#xff08;简称“深开鸿”&#xff09;KaihongOS软件发行版的工业平板、机器人、无人机等商用产品均通过OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;3.2 Release版本兼容性测评&#xff0c;获颁O…...

AIGC音视频工具分析和未来创新机会思考

编者按&#xff1a;相较于前两年&#xff0c;2023年音视频行业的使用量增长缓慢&#xff0c;整个音视频行业遇到瓶颈。音视频的行业从业者面临着相互竞争、不得不“卷”的状态。我们需要进行怎样的创新&#xff0c;才能从这种“卷”的状态中脱离出来&#xff1f;LiveVideoStack…...

Mybatis——返回值(resultType&resultMap)详解

之前的文章里面有对resultType和resultMap的简单介绍这一期出点详细的 resultType&#xff1a; 1&#xff0c;返回值为简单类型。 直接使用resultType“类型”&#xff0c;如string&#xff0c;Integer等。 String getEmpNameById(Integer id); <!-- 指定 result…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...