MySQL——数据类型表的约束

news2025/5/14 10:43:59

目录

数据类型

数值类型 

tinyint类型 

bit类型

float类型

decimal类型

字符类型

char类型

varchar类型

日期和时间类型

选择类型

表的约束

null

default

comment

zerofill

primary key

auto_increment

unique key

foreign key


数据类型

        在MySQL中的数据类型与我们在学习语言上的数据类型大致差不多,只是换了一种说法而已

数值类型 

tinyint类型 

        tinyint,smallint,mediumint,int和bigint都是大差不差的类型,只不过是大小不同而已,这里以tinyint类型作为例子演示;

        在表中创建tinyint类型(默认是有符号类型)并插入一些数据来验证它的范围是否与上面表中的范围相同

        当插入的数据不在tinyint类型(有符号)规定的:-128 ~ 127时,mysql直接报错拦截,不让我们进行插入无效的数据;反过来说,当数据成功插入时就证明数据是合法的,这就说明了数值类型本身是一种约束:倒逼使用者尽可能出入合法的数据,同时也保证了数据库数据的正确,合法性

而在语言上使用无效的数据时可能只是出现警告没有报错拦截,在程序运行时数据截断后再把数据储存起来,这时运行结果就不是我们所预期的;

bit类型

        使用bit类型时要指明bit个数,不指明默认为1,bit个数范围【1,32】

        在原有的表b1中创建bit类型表示性别(0表示女,1表示男)

        创建完表插入数据后,把表的数据打印出来是发现gender数据不显示?因为bit类型显示时是按照ascall码形式显示的,想要转化成0 1就要对gender修改显示方式

        证明是按ascall码显示的

float类型

        使用float要指明两个数:第一个数m指定数据总长度,第二个数d指定小数位精度

        例如:float(4,2)表示的范围是-99.99 ~ 99.99,MySQL在保存值时会进行四舍五入(如果指明无符号的话范围是0~99.99,对半砍一半)

decimal类型

        与float类型类似,但是float类型定义出的精度d太大(d最大为7位)时会精度丢失,而decimal类型精度d相对float来说会比较大一点(d最大为30位)

        对精度要求高的情况下推荐使用decimal类型

字符类型

char类型

        char类型是固定字符串,使用时要定义出长度大小(最大为255),注意这里单位是字符,不是C/C++的单位为字节,所以储存汉字时按照汉字个数定义出的长度大小即可,不用再去计算字节数了(utf8字符集时:1字符 = 3字节)

varchar类型

        varchar类型是可变长字符串,使用时也是一样要给出长度大小,单位是字节,最大字节数为65535字节,使用utf8字符集编码时要进行转化为字符,即最大字符数是:65535 / 3 = 21845字符

        但是在实验时创建长度为21845的varchar时mysql不让我创建了,明明上面mysql提示最大字符数与自己的计算结果是一样的,为什么不然我创建?

        原因是varchar类型底层在实现时与C++的string类似:有计数器与空间大小来记录有多少字节,总的空间数是多少,根据使用字符数大小给你开辟对应大小的空间,所以本身需要1~3字节来储存这些管理数据,按照最大来计算:(65535 - 3) / 3 = 21844字符,但还是不让我创建啊!

        因为还有id字段的影响,varchar类型的最大字节数表示的是一行的最大大小:此时还要在减去4字节才是实际创建varchar的最大字节数!

        关于char与varchar的对比

        使用字符类型选择时:

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

日期和时间类型

  • date :日期 'yyyy-mm-dd' ,占用三字节
  • datetime 时间日期格式 'yyyy-mm-dd HH:ii:ss' 表示范围从 1000 到 9999 ,占用八字节
  • timestamp :时间戳,添加数据时自动补齐当前时间,与datetime 格式完全一致,占用四字节

        date使用:通常是用来记录个人生日信息,datetime使用:通常记录你第一次到公司工作的时间,方便计算工龄与发放工资;而timestamp使用:常见的是用来记录网络论坛上用户评论的时间

选择类型

        使用enum和set可以填写多个数据,在插入数据时选择数据进行插入,但是enum是只能选择一个,而set可以选择多个

        使用场景:创建调查表votes调查用户的爱好

        选择时可以使用枚举的数据,enum可以选择从下标1开始,用数字进行选择;而set想要用数字选择需要进行计算,因为它是按照位图的结构来管理数据的:想要选择前两个爱好输入的数字是3,而不是123,因为3是:011 -> 低位的1代表的是选择乒乓球,一次类推...

        有这样一个需求:想要在全部数据中找到所有爱好包含是‘乒乓球’的用户时,要使用函数find_in_set函数

        如果要挑选的是所有人的爱好中包含乒乓球和羽毛球的呢?    要使用and连接起来

表的约束

        数据类型本身也是一种约束:但你插入的数据不合法时,mysql直接报错拦截你不然进行插入;这样做有两种好处:保证数据库中数据的正确,合法性;倒逼程序员插入正确的操作;而在表中也同样存在约束,mysql提供了约束使用表的操作,如:null,default,comment...

null

        空属性null:mysql上共有两种表达:null 和 not null,字段为null的值是不参与计算的

        建表时填写的字段不设置默认null,也就是该字段插入数据时可以不填写;但如果设置了not null就代表:插入数据时该字段必须填写的是合法的数据,不能是null!

        字段grade设置了not null,插入数据时不带该字段,出现的是不同的报错:这与下面的default有关

default

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

        把上面演示的表中的字段gender添加默认值上去

        插入数据看看有什么不同 

         字段gender设置默认值default,插入数据时不带该字段gender使用默认值,如果有进行插入数据,不管是null还是合法的数据都能插入;在上面null中对字段设置了null,插入数据时不带该数据后报错,原因是没有设置默认值;两者是相互补充的关系,但通常不一起使用

comment

        列描述comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解;使用 desc tablename 看不到,要使用 show create table tablename \G 显示具体信息才能观察到

zerofill

        创建一个表,里面有两个相同的字段int:一个有符号另一个无符号;创建完后使用 desc 查看表时发现在类型一列中多了用括号扩起来的数字,这时什么意思呢?

         插入数据后查看数据,并在字段b中添加zerofill后,再次查看数据

        此时我们发现:字段b前有9个0,加上1就刚好是10位数,这不就是括号里面的值吗!

        所以:设置 zerofill 是用来进行对字段进行格式化输出,至于说 int 为什么多了一位,是因为它是有符号的整数,多了一位符号位; 解决了 zerofill 的问题,那为什么b是10位而不是20位呢?原因是:int 最大值是42亿多,需要用10位数来表示这个最大值

        当然我们也可以自己来设置这个值;当插入的数据的个数大于设置的值则不用0来填充,用自己的数值来表示,我们也可以顺便来验证下填充的0是否会对查询数据有影响

primary key

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

        如果不要主键了,要进行 drop 删除主键

        如果后悔了,想把主键添加到字段id 上来的话,必须先把之前重复的数据删除才能添加

        一个表中只能有一个主键,但主键不仅只能被一个字段使用,还可以与其它字段组合,称为复合主键

        例如:在学校系统中,学生在同一个学期不能重复选择相同的课程修学分(除了挂科重考)

auto_increment

        自增长auto_increment:字段设置自增长使用时自动触发,从当前表中的最大值+1作为新的值,通常与主键primary key 一起使用,成为逻辑主键

        自增长的特点:

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

        查看自增长auto_increment 的值有两种方式

unique key

        唯一键unique key:用来解决表中有多个字段需要唯一性约束的问题;咋一听与主键primary key类似,但还是有区别的

唯一键主键
表中可以存在多个表中只能存在一个
可以允许字段为空不允许字段为空
保证业务逻辑的唯一性标识字段唯一性

        虽然有区别,但两者经常一起使用,相互补充!主键只能保证一个字段的唯一性,但是一张表中不可能其它字段就一定不用保证唯一性了,如:一个学生有学号,名字,电话号码,qq号...

        如果只设置id是主键,插入时如果粗心大意,把不同人的电话号码填写成一个,那里下次我要通过电话号码找人时就会出现冲突

        此时使用唯一键来解决:填入相同的电话号码时就不让你插入

foreign key

        外键foreign key 用于定义主表与从表之间的关系:一般先定义主表(主表要与从表产生关联的字段必须有primary key或者unique key),再定义从表(在里面定义外键约束):主表插入数据时受关联的字段必须在从表中存在(从表删除数据时受关联的字段在主表中不存在)

        比如有两张表:一张表class 记录班级的各种信息,包括班级编号,名字,一张表student 记录学生的各种信息,包括学生号,姓名,电话,年级;如果我们不添加外键的形式,正常实现插入数据:会发现如果 class表中没有id为101的班级,而在 student表中却发现有学生的grade(id)是101的班级,那这不是与 class表中出现冲突吗?相反把本来有id为101的班级数据从 class表中删除,此时 student表中id为101的学生不就又是冲突的吗!所以解决这个问题,就需要外键foreign key来解决:设置时class为主表,student为从表

        如果想在 student表中插入数据为 grade为101时,class表中找不到id为101的数据时插入失败;class表中要想删除id为101的数据,就要等 student表中所有grade=101数据删除后才能删除

        外键的使用:在设计表时理解好表与表之间是否存在相关联系的逻辑关系,是否会在插入数据时发生逻辑上的矛盾或者错误

以上便是全部内容,有问题欢迎在评论区指正,感谢观看!

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

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

相关文章

# YOLOv2:目标检测的升级之作

YOLOv2:目标检测的升级之作 在目标检测领域,YOLO(You Only Look Once)系列算法以其高效的速度和创新的检测方式受到了广泛关注。今天,我们就来深入探讨一下 YOLOv2,看看它是如何在继承 YOLOv1 的基础上进行…

【爬虫】DrissionPage-1

官网地址:DrissionPage官网 小需求采集,我喜欢,我要学。 1 介绍 这是用python编写的爬虫自动化工具,将Selenium 和 Requests 的功能巧妙地整合在一起,提供了统一又简单的操作接口。开发者可以在浏览器模式&#xff0…

Oracle OCP认证考试考点详解083系列15

题记: 本系列主要讲解Oracle OCP认证考试考点(题目),适用于19C/21C,跟着学OCP考试必过。 71. 第71题: 题目 解析及答案: 关于在 Oracle 18c 及更高版本中基于 Oracle 黄金镜像的安装,以下哪…

部署大模型:解决ollama.service: Failed with result ‘exit-code‘的问题

起因是这样: Loaded: loaded (/etc/systemd/system/ollama.service; disabled; preset: enabled) Active: activating (auto-restart) (Result: exit-code) since Tue 2025-05-13 19:31:19 CST; > Process: 12272 ExecStart/usr/bin/ollama serve (codeexited, status1/FAI…

Spring AI 开发本地deepseek对话快速上手笔记

Spring AI Spring AI是一个旨在推进生成式人工智能应用程序发展的项目,Spring AI的核心目标是提供高度抽象化的组件,作为开发AI应用程序的基础,使得开发者能够以最少的代码改动便捷地交换和优化功能模块‌ 在开发之前先得引入大模型&#xf…

SpringBoot中的拦截器

SpringBoot中的拦截器 Filter 典型场景 全局鉴权/接口耗时统计 WebFilter("/*") public class CostFilter implements Filter {Overridepublic void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) {long start System.currentTimeMill…

半小时快速入门Spring AI:使用腾讯云编程助手CodeBuddy 开发简易聊天程序

引言 随着人工智能(AI)技术的飞速发展,越来越多的开发者开始探索如何将AI集成到自己的应用中。人工智能正在迅速改变各行各业的工作方式,从自动化客服到智能推荐系统,AI的应用几乎无处不在。Spring AI作为一种开源框架…

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】金融风控分析案例-10.3 风险指标可视化监控

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 PostgreSQL金融风控分析之风险指标可视化监控实战一、引言二、案例背景三、数据准备(一)数据来源与字段说明(二)数据清洗 四、…

geoserver发布arcgis瓦片地图服务(最新版本)

第一步:下载geoserver服务,进入bin目录启动 需要提前安装好JDK环境,1.8及以上版本 安装完成,页面访问端口,进入控制台界面,默认用户名密码admin/geoserver 第二步:下载地图 破解版全能电子地图下载器&…

多边形,矩形,长方体设置

在cesium中,我们可以通过既有的库来进行对地图的构建 // 向场景中添加一个几何体(立方体) scene.primitives.add(new Cesium.Primitive({// 定义几何体实例geometryInstances: new Cesium.GeometryInstance({// 使用BoxGeometry.fromDimensions方法创建…

(C语言)超市管理系统(测试版)(指针)(数据结构)(二进制文件读写)

目录 前言: 源代码: product.h product.c fileio.h fileio.c main.c 代码解析: fileio模块(文件(二进制)) 写文件(保存) 函数功能 代码逐行解析 关键知识点 读文…

nRF Connect 下载

官方下载路径 点击,或往下拉 选对应的版本 下载成功,数字代表版本好

基于Arduino的贪吃蛇游戏机

3D 打印迷你贪吃蛇游戏机: 在数字娱乐高度发达的今天,我们常常怀念那些经典的复古游戏。其中,贪吃蛇游戏无疑是许多人童年的记忆。今天,我将带你走进一个有趣的 DIY 项目——3D 打印迷你贪吃蛇游戏机。这个项目不仅能够让你重温经…

【PmHub后端篇】Redis分布式锁:保障PmHub流程状态更新的关键

在分布式系统中,确保数据一致性和操作的正确执行是至关重要的。PmHub项目中,通过集成Redis分布式锁来保障流程状态更新,这是一个非常关键的技术点,以下将详细介绍其原理、实现。 1 本地锁的问题 1.1 常见的本地锁 在Java中&…

Starrocks的主键表涉及到的MOR Delete+Insert更新策略

背景 写这个文章的作用主要是做一些总结和梳理,特别是正对大数据场景下的实时写入更新策略 COW 和 MOR 以及 DeleteInsert 的技术策略的演进, 这也适用于其他大数据的计算存储系统。该文章主要参考了Primary Key table. 分析总结 Starrocks 的主键表主…

《操作系统真象还原》第十四章(2)——文件描述符、文件操作基础函数

文章目录 前言文件描述符简介文件描述符原理文件描述符实现修改thread.h修改thread.c 文件操作相关的基础函数inode操作相关函数文件相关函数编写file.h编写file.c 目录相关函数完善fs/dir.h编写fs/dir.c 路径解析相关函数实现文件检索功能修改fs.h继续完善fs.c makefile 结语 …

EMQX v5.0通过连接器和规则同步数据

1 概述 EMQX数据集成功能,帮助用户将所有的业务数据无需额外编写代码即可快速完成处理与分发。 数据集成能力由连接器和规则两部分组成,用户可以使用数据桥接或 MQTT 主题来接入数据,使用规则处理数据后,再通过数据桥接将数据发…

2. 盒模型/布局模块 - 响应式产品展示页_案例:电商产品网格布局

2. 盒模型/布局模块 - 响应式产品展示页 案例&#xff1a;电商产品网格布局 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><style type"text/css">:root {--primary-color…

LVGL的三层屏幕结构

文章目录 &#x1f31f; LVGL 的三层屏幕架构1. **Top Layer&#xff08;顶层&#xff09;**2. **System Layer&#xff08;系统层&#xff09;**3. **Active Screen&#xff08;当前屏幕层&#xff09;** &#x1f9e0; 总结对比&#x1f50d; 整体作用✅ 普通屏幕层对象&…

【PDF】使用Adobe Acrobat dc添加水印和加密

【PDF】使用Adobe Acrobat dc添加水印和加密 文章目录 [TOC](文章目录) 前言一、添加保护加密口令二、添加水印三、实验四、参考文章总结 实验工具&#xff1a; 1.Adobe Acrobat dc 前言 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、添加保护加…