【MySQL】数据类型与表约束

目录

数据类型分类

数值类型

tinyint类型

bit类型

小数类型

字符串类型

日期和时间类型

enum和set

表的约束

空属性

默认值

列描述

zerofill

主键

自增长

唯一键

外键


数据类型分类

数值类型

tinyint类型

  • MySQL中,整形可以是有符号和无符号的,默认有无符号的。
  • 可以通过unsigned来说明某个字段是无符号的。
  • 如果我们向MySQL特定的的类型中插入不合法数据,MySQL是直接拦截,不让我们做对应的操作(这一点和语言不同)。反过来,如果已经有数据被成功插入到MySQL中了,一定插入的时候是合法的。所以,MySQL中,数据类型本身也是一种约束。

bit类型

bit[(M)],M表示每个值的位数,范围从1到64。如果忽略M,那么默认是1。

  • bit字段在显示时,是按照ASCII码对应的值显示;

小数类型

float

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

例如,float(4,2)表示的范围是-99.99~99.99,MySQL在保存值会进行四舍五入(99.991->99.99)。如果定义的是float(4,2)unsigned,范围是0-99.99。

decimal

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

  • decimal(5,2)表示的范围是-999.99-999.99
  • decimal(5,2)unsigned表示的范围是0-999.99
  • decimal和float很像,只是精度不一样,decimal更精确。

字符串类型

char

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

这里的char和语言中的char不一样,char(2)可以存放两个字符,可以是字母或汉字,但是不能超过2个,最多是255个。

varchar

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

L是这个字符串长度的上限,其真实长度可能小于等于这个长度。

  • varchar字节数可以指定为0-65535之间的值,但有1-3个字节用于记录数据大小,所以有效字节数是65532;
  • 当表的编码是utf8时,varchar(n)的最大值是65532/3=21844(utf8中一个字符占用3个字节)。

char和varchar的比较

如何选择定长或变长字符串?

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

日期和时间类型

常用的日期有如下3个:

  • date:日期‘yyyy-mm-dd’,占用三个字节;
  • datetime时间日期格式‘yyyy-mm-dd HH:ii:ss’,占用8字节;
  • timestamp:时间戳,和datetime格式完全一致,占用4字节。

当对表进行更新时,timestamp数据(如果有)自动更新。

enum和set

enum:枚举,单选类型,enum(‘选项1’,‘选项2’,…)。这些选项值依次对应1 2 3 4 5 6…。

set:集合,多选类型,set(‘选项1’,‘选项2’,…)。在插入时,如果传入多个选项,可以使用逗号分隔符传进去,也可以用数组下标(位图方式表示,这些选项的每个选项值依次对应如下数字,1 2 4 8 16 32…)。

创建表:

插入数据:

想查询所有喜欢登山的人:

这样查询不能查出所有结果。

集合查询函数find_in_set函数

find_in_set(sub,str_list):如果sub在str_list中,那么返回下标(非0);如果不在,返回0。

查询爱好登山的人:

查询爱好登山和篮球的人:

表的约束

表的约束,表中一定要有各种约束,通过约束,让我们未来插入数据库表中的数据是符合预期的,约束本质是通过技术手段,倒逼程序员,插入正确的数据。反过来,站在MySQL的角度,凡是插入进来的数据,都是符合数据约束的!

约束的最终目标:保证数据的完整性和可预期性。

空属性

  • 两个值:null(默认)和not null;

例子:创建一个表,包含班级名称和所在教室,这两个字段不能为空。

当插入数据时,如果没有给not null的字段传入值,那么会报错。

默认值

default:如果设置了,用户将来插入,有具体的数据,就用用户的,没有就用默认的。

如下图,如果我们没有明确指定一列要插入,用的是default,如果建表中,对应列没有默认的default值,则无法直接插入。

default和not null不冲突,而是相互补充的,not null是当用户想插入的时候,约束的是,要么是NULL,要么是合法数据。而default是当用户忽略这一列的时候,使用默认值(如果设置了),如果没有设置,直接报错!

列描述

comment,没有实际含义,会根据表创建语句保存,用来给程序员看的进行了解。

通过show语句可以查看comment:

zerofill

我们看到int(10),这个10代表什么?实际上,如果没有zerofill这个属性的话,括号内的数字毫无意义。

如果没有设置zerofill,那么显示结果是:

如果设置了zerofill属性,那么显示结果是:

这就是说,如果宽度小于设定的宽度,自动填充0。这只是最后显示的结果,实际存储的还是200,我们可以通过hex函数证明:

主键

主键:primary key用来唯一约束该字段里的数据,不能重复,不能为空(自动设置为not null),一张表中最多有1个主键,主键所在的列通常是整数类型。

案例:

  • 创建表的时候直接在字段上指定主键;

  • 主键中的字段不能重复,一旦重复就会失败;

  • 删除主键

  • 当表创建好但是还没主键的时候,可以再次追加主键;

  • 复合主键

在创建表的时候,在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段作为主键,可以使用复合主键。

自增长

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

自增长有如下特点:

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

如果插入主键值,那下次从这个值开始自增长。

通过last_insert_id()查询上次插入的键值。

唯一键

一张表中往往有多个字段需要唯一性,数据不能重复,但是一张表中只能有一个主键;唯一键就可以解决表中有多个字段需要唯一性约束的问题。唯一键的本质和主键差不多,但唯一键允许为空,且可以多个为空,空字段不做唯一性比较。

唯一键和主键的区别:主键更多的是标识唯一性的,而唯一键更多是保证在业务上,不要和别的信息出现重复。比如在员工管理系统,可以将员工身份证号作为主键,同时为了保证员工号不出现输入重复错误,可以将员工号作为唯一键。

一般把和业务无关的字段设为主键,这样当业务调整的时候,就不会对主键做过大的调整。

外键

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

语法:

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

创建主表:

创建从表:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

tableau之标靶图、甘特图和瀑布图

一、标靶图 概念 标靶图(Bullet Chart)是一种用于显示数据与目标之间关系的可视化图表,常用于业务和管理报告中。其设计旨在用来比较实际值与目标值,同时展示额外的上下文信息(如趋势)。 作用 可视化目标…

微服务学习(2):实现SpringAMQP对RabbitMQ的消息收发

目录 SpringAMQP是什么 为什么采用SpringAMQP SpringAMQP应用 准备springBoot工程 实现消息发送 SpringAMQP是什么 Spring AMQP是Spring框架下用于简化AMQP(高级消息队列协议)应用开发的一套工具集,主要针对RabbitMQ等消息中间件的集成…

【JAVA SE基础】抽象类和接口

目录 一、前言 二、抽象类 2.1 抽象类的概念 2.2 抽象类语法 2.3 抽象类特性 2.4 抽象类的作用 三、接口 3.1 什么是接口 3.2 语法规则 3.3 接口使用 3.4 接口特性 3.5 实现多接口 3.6 接口间的继承 四、Object类 4.1 获取对象信息( toString() &…

《每天读一个JDK源码》之HashMap解读

📌《每天读一个JDK源码》之HashMap解读 🔗源码定位:java.util.HashMap(建议IDE对照阅读) 今天我们来破解Java集合框架中最精妙的艺术品——HashMap!它不仅是面试必考题(出现率99%)&…

蓝牙接近开关模块感应开锁手机靠近解锁支持HID低功耗

ANS-BT101M是安朔科技推出的蓝牙接近开关模块,低功耗ble5.1,采用UART通信接口,实现手机自动无感连接,无需APP,人靠近车门自动开锁,支持苹果、安卓、鸿蒙系统,也可以通过手机手动开锁或上锁&…

[STM32]从零开始的STM32 BSRR、BRR、ODR寄存器讲解

一、前言 学习STM32一阵子以后,相信大家对STM32 GPIO的控制也有一定的了解了。之前在STM32 LED的教程中也教了大家如何使用寄存器以及库函数控制STM32的引脚从而点亮一个LED,之前的寄存器只是作为一个引入,并没有深层次的讲解,在教…

Linux下的网络通信编程

在不同主机之间,进行进程间的通信。 1解决主机之间硬件的互通 2.解决主机之间软件的互通. 3.IP地址:来区分不同的主机(软件地址) 4.MAC地址:硬件地址 5.端口号:区分同一主机上的不同应用进程 网络协议…

C#高级:结合Linq的SelectMany方法实现笛卡尔积效果

一、笛卡尔积定义 又称直积&#xff0c;表示为X Y&#xff0c;第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员 二、基础示例 class Program {static void Main(string[] args){try{List<List<string>> input new List<List<string&g…

通信原理速成笔记(信息论及编码)

信息论基础 信息的定义与度量 信息是用来消除不确定性的内容。例如&#xff0c;在猜硬币正反的情境中&#xff0c;结果存在正反两种不确定性&#xff0c;而得知正确结果能消除这种不确定性&#xff0c;此结果即为信息。单个事件的信息量&#xff1a;对于离散信源中的事件xi​&…

MySQL实现文档全文搜索,分词匹配多段落重排展示,知识库搜索原理分享

一、背景 在文档搜索场景中&#xff0c;高效精准的搜索功能至关重要&#xff0c;能提升检索效率&#xff0c;为用户提供精准、快速的信息获取体验&#xff0c;提高工作效率。在文档管理系统里&#xff0c;全文搜索是非常重要的功能之一。随着文档数量增长&#xff0c;如何快速…

力扣hot100——回溯

文章目录 前言55.全排列题目描述思路&#xff1a;DFS回溯code 56.子集题目描述思路&#xff1a;dfs回溯code 57.电话号码的字母组合题目描述思路&#xff1a;DFS回溯code 58.数组总和题目描述题目描述code 59.括号生成题目描述思路&#xff1a;DFS回溯code 60.单词搜索题目描述…

云和恩墨亮相PolarDB开发者大会,与阿里云深化数据库服务合作

2025年2月26日&#xff0c;备受瞩目的阿里云PolarDB开发者大会于北京嘉瑞文化中心盛大举行&#xff0c;众多行业精英齐聚一堂&#xff0c;共襄技术盛会。云和恩墨作为阿里云重要的生态合作伙伴受邀参会。云和恩墨联合创始人兼技术研究院总经理杨廷琨与阿里云智能数据库产品事业…

Vue前端项目构建教程

文章目录 1. 引言2.环境准备2.1 请自行查找资料安装以下开发工具2.2 安装cnpm 3. 创建Vue3项目3.1 安装依赖3.2 项目结构 4. 配置Vue项目4.1 在项目根目录下添加环境变量文件4.2 添加环境变量 5. 常用插件和工具总结 1. 引言 本前端项目将使用Vue3 Vite4构建。 Vue3是目前最…

seacms v9 实现的MySQL注入

目录 过滤关键词information_schema 怎么办 一、环境搭建 二、环境分析 三、源代码分析 1、过滤程序 2、注入点 四、获取数据库名 五、获取数据库表名 六、获取表的列名 七、获取数据信息 过滤关键词information_schema 怎么办 1.、利用sys数据库&#xff08;MySQL 5.…

鸿蒙NEXT开发-元服务和服务卡片的开发

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 目录 1. 元服务基本概念 1.1 基本介绍 1.2 元…

【考试大纲】高级系统架构设计师考试大纲

目录 引言一、 考试说明1.考试目标2.考试要求3.考试科目设置二、 考试范围考试科目1:系统架构设计综合知识考试科目2:系统架构设计案例分析考试科目3:系统架构设计论文引言 最新的系统架构设计师考试大纲出版于 2022 年 11 月,本考试大纲基于此版本整理。 一、 考试说明…

Springboot快速接入豆包大模型

背景 突然接到上面的通知&#xff0c;想要在系统里面接入各大模型的能力&#xff0c;我这边随机选了个豆包&#xff0c;然后快速对接了一下&#xff0c;很顺利&#xff0c;一把过&#xff0c;现在文档的快速入门还是很ok的&#xff0c;在此记录一下过程&#xff0c;给宝子们参考…

Failed to start The PHP FastCGI Process Manager.

报错如下&#xff1a; Job for php-fpm.service failed because the control process exited with error code. See "systemctl status php-fpm.service" and "journalctl -xe" for details. 2月 25 21:49:00 nginx systemd[1]: Starting The PHP FastC…

【HarmonyOS Next】鸿蒙应用折叠屏设备适配方案

【HarmonyOS Next】鸿蒙应用折叠屏设备适配方案 一、前言 目前应用上架华为AGC平台&#xff0c;都会被要求适配折叠屏设备。目前华为系列的折叠屏手机&#xff0c;有华为 Mate系列&#xff08;左右折叠&#xff0c;华为 Mate XT三折叠&#xff09;&#xff0c;华为Pocket 系列…

coze生成的工作流,发布后,利用cmd命令行执行。可以定时发日报,周报等。让他总结你飞书里面的表格。都可以

coze生成的工作流&#xff0c;发布后&#xff0c;利用cmd命令行执行。可以定时发日报&#xff0c;周报等。让他总结你飞书里面的表格。都可以。 很简单。 准备工作&#xff0c;先发布你的工作流&#xff0c;和发布应用。 然后&#xff0c;点击扣子API 。 申请一个&#xff0…