【MySQL】数据类型和表的约束

1. 数据类型

分类数据类型解释
数值类型BIT (M)位类型。M位数,默认为1范围1-64
BOOL01表示真假
TINYINT [UNSIGNED]8位整型
SMALLINT [UNDIGNED]16位短整型
INT [UNSIGNED]32位整型
BIGINT [UNSIGNED]64位长整型
小数类型FLOAT [ (M, D) ] [UNSIGNED]32位浮点类型,M整体长度,D小数长度
DOUBLE [ (M, D) ] [UNSIGNED]64位浮点类型,M整体长度,D小数长度
DECIMAL (M, D) [UNSIGNED]M整体长度,D小数位数
文本、二进制类型CHAR (SIZE)定长字符串,L字符个数,最大255字符
VARCHAR (SIZE)变长字符串,L字符个数,最大65535字节
BLOB二进制数据
TEXT大文本,不支持全文索引,不支持默认值
时间日期DATEyyyy-mm-dd仅日期格式,占3字节
DATETIMEyyyy-mm-dd hh:mm:ss格式,支持自定义,占8字节
TIMESTAMPyyyy-mm-dd hh:mm:ss格式,实际是时间戳,占4字节
String类型ENUM单个字符串对象,多选一
SET字符串对象集合,多选多

1.1. 数值

ERROR 1264 (22003): Out of range value for column 'number' at row 1

SQL会直接拒绝插入越界的数据。数据类型本质就是一种数据安全的约束。

  • float(4,2)的范围是:-99.99~99.99,小数会自动四舍五入,大小越界报错。
  • float(4,2) usigned范围是:0~99.99,正数表示范围不变。
  • float小数默认显示2位,整数超过9999990只能存到9999990。
  • float小数设置超过7位存在精度损失,decimal小数精度更高。
  • decimal小数精度最大30位,整体最大65位。D默认为0,M默认为10。

1.2. 字符串

  • varchar最大65535个字节,头3字节存储长度,故utf8编码varchar最大存储21844个字符。当然MySQL限制一行元素大小之和最大65535个字节。

  • char类型始终占用L个字符的大小,varchar类型的占用和数据长度相关。

  • 数据长度不变就用char,长度变化就用varchar;

  • 定长浪费空间但效率高,变长节省空间但效率低。

1.3. enum和set

enum:

enum ('选项1', '选项2', '选项3', ...)

新增时必须插入规定的选项值中的一个。enum类型,实际存储的是从1开始的数字下标。
 
set:

set  ('选项1', '选项2', '选项3', ...)

set类型可以选择多个选项,用逗号隔开,合并成一个字符串。


set存储时采用位图结构。下标的二进制位,从低到高每个比特位表示一个选项,为1表示具有该选项,反之则没有。
 
WHERE:
在这里插入图片描述

where只能筛选出严格匹配的记录,用find_in_set可以筛选出包含该选项的记录。

 

2. 表的约束

MySQL为保证数据的完整性一致性,给我们提供了如下各种强约束。

2.1 空属性

MySQL中的NULL表示不存在、为空。列默认可以为空,not null表示不许为空。

create table stu (
    name varchar(16) not null
);

2.2 默认值

通过default设置列的默认值,可以避免该字段为空。

create table genders (
    gender char(1) default '男'
);

2.3 列描述

comment就是注释。

create table genders (
    gender char(1) comment '性别'
);

2.4 零填充

建表时MySQL自动为int字段添加(10)。设置zerofill的列,如果数据宽度低于指定位数,显示时会在前面补零,不影响存储。

alter table tb modify a(3) int unsigned zerofill;
select * from tbs;
+-----+
| a   |
+-----+
| 001 |
| 011 |
| 111 |
+-----+

2.5 主键

数据库要求表中有一个字段作为一行记录的唯一标识,就是主键。

类似于序号,根据主键能够唯一筛选出一条记录。主键字段不可为空不可重复,一张表只能有一个主键。

create table tb (
    id int primary key
);

删除主键

alter table `tb_name` drop primary key; # 只是为字段去掉主键约束,并不是删除整列。

追加主键

alter table `tb_name` add primary key(`field_name`); # 为已存在字段追加主键,如果有重复值,会追加失败。

复合主键

复合主键可以让多列合起来作为主键。这样只需要保证多列不同时重复就行。

create table `tb_name` (
	`field1` type,
    `field2` type,
    primary key (`field1`, `field2`, ...) # 设置复合主键
);

2.6 自增长

设置auto_increment的字段,插入时可以不给值,新记录的会自动取值为当前最大值加1。一般自增长的字段都是主键。

create table tb (
    id int primary key auto_increment
) auto_increment=100;
  • 自增长字段默认从1开始,也可以插入数据,只要不重复即可。之后会从最大值开始递增。
  • 被自增长的字段必须作为主键或者其他具有唯一性的键使用。

2.7 唯一键

如果存在多个字段需要保证唯一性,但主键只有一个,所以只能用唯一键约束。

create table stu (
	id1 int primary key,
	id2 int unique
);
  • 唯一键允许为空,NULL表示不参与运算。如果将唯一键设置为not null则自动转换成主键。
  • 主键因索引而唯一,唯一键因业务而唯一。
  • 主键只能有一个,唯一键能设置多个。

主键和唯一键并不冲突,只是负责数据在不同层面的唯一性。

2.8 外键

外键用来将从表和主表之间建立关系。外键定义在从表上,一般外键就对应着主表的主键或者唯一键。

create table tb (
	foreign key (`field`) references `tb_master`(`field`)
)

通过外键产生关系的表,除了在逻辑上有关联,MySQL也会维护该逻辑对用户操作产生约束。

比如班级表中得先有id为30的班级,才能在学生表中添加class_id为30的学生。

要删除班级表中id为20的班级,首先必须保证学生表中没有对应班级的学生。

对于数据库用户来说,外键是为了方便业务关联,对于MySQL来说,外键是为了产生对应的外键约束,保证数据的安全。

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

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

相关文章

【机器学习】机器学习重要方法——深度学习:理论、算法与实践

文章目录 引言第一章 深度学习的基本概念1.1 什么是深度学习1.2 深度学习的历史发展1.3 深度学习的关键组成部分 第二章 深度学习的核心算法2.1 反向传播算法2.2 卷积神经网络(CNN)2.3 循环神经网络(RNN) 第三章 深度学习的应用实…

群晖NAS部署VoceChat私人聊天系统并一键发布公网分享好友访问

文章目录 前言1. 拉取Vocechat2. 运行Vocechat3. 本地局域网访问4. 群晖安装Cpolar5. 配置公网地址6. 公网访问小结 7. 固定公网地址 前言 本文主要介绍如何在本地群晖NAS搭建一个自己的聊天服务Vocechat,并结合内网穿透工具实现使用任意浏览器远程访问进行智能聊天…

android adb常用命令集

1、系统调试 #adb shell:进入设备的 shell 命令行界面,可以在此执行各种 Linux 命令和特定的 Android 命令。 #adb shell dumpsys:提供关于系统服务和其状态的详细信息。 #adb logcat:实时查看设备的日志信息。可以使用过滤条件来…

浅析Vite本地构建原理

前言 随着Vue3的逐渐普及以及Vite的逐渐成熟,我们有必要来了解一下关于vite的本地构建原理。 对于webpack打包的核心流程是通过分析JS文件中引用关系,通过递归得到整个项目的依赖关系,并且对于非JS类型的资源,通过调用对应的loade…

使用 Reqable 在 MuMu 模拟器进行App抓包(https)

1、为什么要抓包? 用开发手机应用时,查看接口数据不能像在浏览器中可以直接通过network查看,只能借助抓包工具来抓包,还有一些线上应用我们也只能通过抓包来排查具体的问题。 2、抓包工具 实现抓包,需要一个抓包工具…

Java8使用Stream流实现List列表查询、统计、排序、分组、合并

Java8使用Stream流实现List列表查询、统计、排序以及分组 目录 一、查询方法1.1 forEach1.2 filter(T -> boolean)1.3 filterAny() 和 filterFirst()1.4 map(T -> R) 和 flatMap(T -> Stream)1.5 distinct()1.6 limit(long n) 和 skip(long n) 二、判断方法2.1 anyMa…

G7 - Semi-Supervised GAN 理论与实战

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 目录 理论知识模型实现引用、配置参数初始化权重定义算法模型模型配置模型训练训练模型 模型效果总结与心得体会 理论知识 在条件GAN中,判别器只用…

轻松搞定数据可视化配色,这份指南助你一臂之力!

配色是数据可视化图表的主要因素。一组合适的配色可以表达数据的重点和趋势,而不良的配色会削弱可视化表达的有效性。在本文中,我将梳理数据可视化中使用的配色板类型,通过案例揭示数据可视化配色技巧,并介绍可生成配色板的插件&a…

Day 32:503. 下一个更大的元素Ⅱ

Leetcode 503. 下一个更大的元素Ⅱ 给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它…

嵌入式实验---实验七 SPI通信实验

一、实验目的 1、掌握STM32F103SPI通信程序设计流程; 2、熟悉STM32固件库的基本使用。 二、实验原理 1、使用STM32F103R6通过74HC595控制一位LID数码管,实现以下两个要求: (1)数码管从0到9循环显示; …

[leetcode]add-strings 字符串相加

. - 力扣(LeetCode) class Solution { public:string addStrings(string num1, string num2) {int i num1.length() - 1, j num2.length() - 1, add 0;string ans "";while (i > 0 || j > 0 || add ! 0) {int x i > 0 ? num1[i…

[word] word 如何在文档中进行分栏排版? #媒体#其他#媒体

word 如何在文档中进行分栏排版? 目标效果 将唐代诗人李白的组诗作品《清平调词》进行分栏排版,共分三栏,每一首诗作为一栏,参考效果如下图。

基于STM32的智能健康监测手表

目录 引言环境准备智能健康监测手表系统基础代码实现:实现智能健康监测手表系统 4.1 数据采集模块4.2 数据处理与分析4.3 通信模块实现4.4 用户界面与数据可视化应用场景:健康监测与管理问题解决方案与优化收尾与总结 1. 引言 智能健康监测手表通过使…

ONLYOFFICE 8.1版本桌面编辑器深度体验:创新功能与卓越性能的结合

ONLYOFFICE 8.1版本桌面编辑器深度体验:创新功能与卓越性能的结合 随着数字化办公的日益普及,一款高效、功能丰富的办公软件成为了职场人士的必备工具。ONLYOFFICE团队一直致力于为用户提供全面而先进的办公解决方案。最新推出的ONLYOFFICE 8.1版本桌面编…

【Mysql】数据库事务-手动提交

数据库事务 ** 什么是事务** 事务是一个整体,由一条或者多条SQL 语句组成,这些SQL语句要么都执行成功,要么都执行失败, 只要有一条SQL出现异常,整个操作就会回滚,整个业务执行失败。 比如: 银行的转账业务,张三给李四转账500元 , 至少要操作两次数据库, 张三 -500, 李四 50…

国产的浏览器我就喜爱这一款,它比微软的edge更让人喜爱

小编最近在用Yandex搜索引擎,这个基本上追剧找资料,看漫画什么的都是用到它(dddd) 有小伙伴就说了,这搜索引擎确实好用,但是不够方便呀,就很多浏览器都不能将它设置为默认引擎进行使用&#xf…

【ONLYOFFICE深度探索】:ONLYOFFICE桌面编辑器8.1震撼发布,打造高效办公新境界

文章目录 一、功能完善的PDF编辑器:解锁文档处理新维度二、幻灯片版式设计:释放创意,打造专业演示三、改进从右至左显示:尊重多元文化,优化阅读体验四、新增本地化选项:连接全球用户,跨越语言障…

详解Spring AOP(一)

目录 1. AOP概述 2.Spring AOP快速入门 2.1引入AOP依赖 2.2编写AOP程序 3.Spring AOP核心概念 3.1切点(PointCut) 3.2连接点(Join Point) 3.3通知(Advice) 3.4切面(Aspect) …

JDBC的概念 ,核心API的介绍 , 注册驱动介绍

第一章 JDBC 1、JDBC的概念 目标 能够掌握JDBC的概念能够理解JDBC的作用 讲解 客户端操作MySQL数据库的方式 使用第三方客户端来访问MySQL:SQLyog、Navicat 使用MySQL自带的命令行方式 通过Java来访问MySQL数据库,今天要学习的内容 如何通过Java代…

时间?空间?复杂度??

1.什么是时间复杂度和空间复杂度? 1.1算法效率 算法效率分析分为两种:第一种是时间效率,第二种是空间效率。时间效率被称为时间复杂度,而空间效率被称为空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度,而空…