MySQL学习(五):数据类型与约束

MySQL学习(五):数据类型与约束

文章目录

  • MySQL学习(五):数据类型与约束
    • 1. 数据类型与属性
      • 1.1 所有的数据类型
      • 1.2 所有属性
    • 2. 数据类型详解
      • 2.1 整型
      • 2.2 浮点类型
      • 2.3 定点数类型
      • 2.4 位类型
      • 2.5 日期与时间
      • 2.6 文本字符串
      • 2.7 二进制字符串
      • 2.8 JSON
    • 3. 约束基础
      • 3.1 约束结构
      • 3.2 添加约束的位置
      • 3.3 查看约束信息
      • 3.4 约束分类
      • 3.5 约束功能一览
    • 4. 约束详解
      • 4.1 非空约束
      • 4.2 唯一约束
      • 4.3 主键约束
      • 4.4 自增约束
      • 4.5 外键约束
      • 4.6 检查约束
        • MySQL 5.7 之前的限制
        • MySQL 5.7 及以上版本
        • 注意事项
      • 4.7 默认值约束
        • 修改默认值
        • 注意事项

1. 数据类型与属性


1.1 所有的数据类型

MySQL数据库中支持多种数据类型,它们决定了数据的存储方式和处理方式。

在这里插入图片描述

1.2 所有属性

除了数据类型本身,MySQL还提供了各种属性来进一步定义字段的行为和存储需求。

在这里插入图片描述

2. 数据类型详解


2.1 整型

整型数据用于存储没有小数部分的数字。
在这里插入图片描述

  • int (n)n 表示显示宽度,配合 zerofill 属性,当数据不足 n 位时,会自动用 0 填充。需要注意的是,在 5.7 版本中,单独使用 int (n) 没有意义,它会被自动视为 unsigned,使其只能存储正数。

  • unsigned:指定整型字段只能存储正数。

2.2 浮点类型

浮点数用于存储有小数部分的数字。

  • double(n,m)n 表示总位数,m 表示小数位数。这是非标准语法,其他数据库语言可能不支持。

  • 浮点数在存储和计算时可能会出现精度问题。

2.3 定点数类型

定点数类型用于需要精确到小数点后指定位数的数值。
在这里插入图片描述

  • (M,D)M 表示总位数,D 表示小数位数。默认值为 (5,0)

  • 定点数类型精度高,通常使用字符串在底层存储。

  • 如果需要表示范围大,对精度要求不高,可以使用 double 类型。

2.4 位类型

位类型用于存储固定长度的位字段。
在这里插入图片描述

  • bit(M)M 表示位数。

2.5 日期与时间

日期和时间类型用于存储日期和时间数据。
在这里插入图片描述

  • DATE:存储日期。
  • TIME:存储时间。
  • DATETIME:存储日期和时间。
  • TIMESTAMP:存储日期和时间,并具有时区信息。

2.6 文本字符串

文本字符串类型用于存储字符数据。
在这里插入图片描述
在这里插入图片描述

  • char(M):固定长度字符串,如果实际长度小于 M,则用空格填充。
  • varchar(M):可变长度字符串,根据实际内容长度存储。
  • TEXT:用于存储大文本数据。
  • ENUM:枚举类型,只允许从一组预定义的值中选择。
  • SET:集合类型,允许从一组预定义的值中选择多个值。

2.7 二进制字符串

二进制字符串类型用于存储二进制数据。
在这里插入图片描述
在这里插入图片描述

  • BINARY(M):固定长度二进制字符串。
  • VARBINARY(M):可变长度二进制字符串。
  • BLOB:用于存储大量二进制数据,如图片、音频、视频等。

2.8 JSON

JSON类型用于存储JSON格式的数据。

  • JSON:用于存储JSON对象。
  • JSON document:用于存储JSON文档。
create table `tableName`(
`` JSON
);insert into `tableName`(``)
values ('{key:value,key:value}');select `` -> '$.key' as 别名
from `tableName`

3. 约束基础


3.1 约束结构

在MySQL数据库中,约束是维护数据完整性和一致性的重要工具。它们规定了数据在表中应该如何存储和操作,防止不合法的数据进入数据库。

3.2 添加约束的位置

约束可以添加到表中的阶段:

  • 创建表时:这是最常见的方式,在定义表结构的同时即可指定约束条件。

    CREATE TABLE `employee` (`id` INT NOT NULL,`name` VARCHAR(100) NOT NULL,PRIMARY KEY (`id`)
    );
    
  • 修改表时:使用 ALTER TABLE 语句可以在表创建后添加约束。

    ALTER TABLE `employee`
    ADD CONSTRAINT `email_unique` UNIQUE (`email`);
    

3.3 查看约束信息

要查看表中的所有约束及其定义,可以使用 INFORMATION_SCHEMA 数据库中的 table_constraints 表。

SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE table_name = 'employee';

3.4 约束分类

MySQL中的约束可以分为:

  • 列级约束:直接作用于单个列,例如非空约束、唯一约束、主键约束等。
  • 表级约束:作用于整个表,如外键约束和检查约束(在MySQL 5.7及以上版本支持)。
  • 单列约束:仅对单个列生效,如非空约束、唯一约束等。
  • 多列约束:对多个列组合生效,如复合唯一约束、复合外键约束等。

3.5 约束功能一览

MySQL中常用的约束类型及其功能:

约束类型功能描述
NOT NULL确保列中的数据不能为空。
UNIQUE确保列中的数据是唯一的,但可以有多个 NULL 值。
PRIMARY KEY确保列中的数据是唯一的,并且非空,同时自动创建唯一索引。一个表只能有一个主键。
FOREIGN KEY用于建立两个表之间的引用关系,确保数据的引用完整性。
CHECK确保列中的数据满足特定的条件。MySQL 5.7版本及以下不支持该约束。
DEFAULT为列指定默认值,如果插入数据时没有指定该列的值,则自动使用默认值。

4. 约束详解


4.1 非空约束

非空约束 (NOT NULL) 确保指定的列在插入数据时不能为空。

CREATE TABLE `employee` (`id` INT NOT NULL,`name` VARCHAR(100) NOT NULL
);

尝试插入一个包含空值的非空列将会导致错误。

4.2 唯一约束

唯一约束 (UNIQUE) 确保列中的数据是唯一的,但允许有多个 NULL 值。

CREATE TABLE `employee` (`email` VARCHAR(255) UNIQUE
);

4.3 主键约束

主键约束 (PRIMARY KEY) 结合了非空约束和唯一约束的功能,确保数据唯一且非空。

CREATE TABLE `employee` (`id` INT PRIMARY KEY,`name` VARCHAR(100)
);

一个表只能有一个主键,且主键列的值必须是唯一的。

4.4 自增约束

自增约束通常与主键约束结合使用,自动为每条记录生成唯一的标识符。

CREATE TABLE `employee` (`id` INT PRIMARY KEY AUTO_INCREMENT,`name` VARCHAR(100)
);

当向表中插入新记录时,如果没有指定主键值,MySQL会自动为该字段生成一个唯一的值。

4.5 外键约束

外键约束 (FOREIGN KEY) 用于建立两个表之间的引用关系,确保数据的一致性。
在这里插入图片描述

CREATE TABLE `department` (`id` INT PRIMARY KEY,`name` VARCHAR(100)
);CREATE TABLE `employee` (`id` INT PRIMARY KEY AUTO_INCREMENT,`name` VARCHAR(100),`department_id` INT,CONSTRAINT `fk_department` FOREIGN KEY (`department_id`) REFERENCES `department` (`id`)
);

在这个例子中,employee 表的 department_id 字段是 departmentid 字段的外键。

4.6 检查约束

在MySQL数据库中,检查约束(CHECK)是一种用于确保列中的值满足特定条件的机制。它允许数据库管理员定义复杂的数据验证规则,从而保证数据的准确性和合理性。

MySQL 5.7 之前的限制

值得注意的是,MySQL 5.7版本之前的版本不支持检查约束。因此,在创建表时,需要使用其他方法来确保数据的合理性,例如:

CREATE TABLE `tableName` (`id` INT,`last_name` VARCHAR(15),`salary` DECIMAL(10,2),CONSTRAINT `salary_check` CHECK (`salary` > 2000)
);

在上述示例中,尝试插入一个薪资小于或等于2000的记录将会失败,因为违反了检查约束。

MySQL 5.7 及以上版本

从MySQL 5.7版本开始,检查约束被引入,允许数据库管理员以更简洁的方式定义数据验证规则。

CREATE TABLE `tableName` (`id` INT,`last_name` VARCHAR(15),`salary` DECIMAL(10,2) CHECK (`salary` > 2000)
);

在此示例中,CHECK 约束确保了 salary 列中的值必须大于2000。每次插入或更新数据时,MySQL都会自动执行这个检查,确保数据的合理性。

注意事项
  • 检查约束不能直接在 ALTER TABLE 语句中添加,只能在创建表时使用。
  • 检查约束不能与 NOT NULL 约束组合使用。
  • 检查约束可能对性能产生一定影响,因为它需要对每一行数据进行检查。

4.7 默认值约束

默认值约束(DEFAULT)允许您为列指定一个默认值,当插入新记录时,如果没有为该列指定值,系统将自动使用默认值填充。

CREATE TABLE `tableName` (`id` INT AUTO_INCREMENT,`last_name` VARCHAR(15),`salary` DECIMAL(10,2) DEFAULT 2000
);

在上述示例中,如果尝试插入一个只包含 id 的记录,salary 列将自动被设置为默认值 2000。

修改默认值

NOT NULL 约束类似,修改默认值的方法也与修改列定义相同:

ALTER TABLE `tableName`
MODIFY COLUMN `salary` DECIMAL(10,2) DEFAULT 3000;

通过这种方式,可以轻松更新列的默认值,而无需重新创建表。

注意事项
  • 默认值可以是任何有效的SQL表达式,包括常量、函数调用或计算表达式。
  • 默认值对于自动填充数据非常有用,尤其是在创建新记录时。
  • 默认值不会影响现有记录,除非明确修改这些记录的值。

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

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

相关文章

Linux环境基础开发工具的使用

vim编辑器的基本操作: 在linux环境下输入vim 文件名就可以进入编辑模式. 上述四种模式必须退到命令模式才能进行下一个模式. 在编辑器中写完之后,输入ESC进入命令模式,然后再输入shift:进入低行模式并输入wq保存并退出. 在命令模式下的操作: 光标所在行:1.输入yy进行复制, 输…

ubuntu24 root用户修改密码 ubuntu新系统没有创建root用户

ubuntu 系统在虚拟机新建一个ubuntu24,但是在配置系统时候,并没有配置root密码,只是新增了一个自定义账号于密码,在创建好后,可以登录系统,设置root密码~ 1. ubuntu系统初始化后,登录自建账号 …

k8s介绍-搭建k8s

Kubernetes介绍,官网:Kubernetes 应用部署方式演变 传统部署:互联网早期,会直接将应用程序部署在物理机上 优点:简单,不需要其他技术的参与 缺点:不能为应用程序定义资源使用边界&#xff0c…

【C++网络编程】(一)Linux平台下TCP客户/服务端程序

文章目录 Linux平台下TCP客户/服务端程序服务端客户端相关头文件介绍 Linux平台下TCP客户/服务端程序 图片来源:https://subingwen.cn/linux/socket/ 下面实现一个Linux平台下TCP客户/服务端程序:客户端向服务器发送:“你好,服务…

从零创建苹果App应用,不知道怎么申请证书的可以先去看我的上一篇文章

用大家自己的开发者账户,登录进入App Store Connect ,注册自己的应用 进入之后,点击增加 填写相关的信息 一切顺利的话,就可以来到这个页面

element plus的el-select分页

摘要&#xff1a; el-select的数据比较多的时候&#xff0c;必须要分页&#xff0c;处理方案有全部数据回来&#xff0c;或者添加搜索功能&#xff0c;但是就有个问题就是编辑的时候回显问题&#xff0c;必须要保证select的数据有对应的id与name匹配回显&#xff01; <el-fo…

计算机网络-VRRP实验配置

前面我们大致学习了VRRP的概念和基本原理&#xff0c;但是网络这块就是要多敲命令多用才能印象深刻&#xff0c;今天开始进行一些实验配置&#xff0c;结合日常工作的场景分析VRRP在实际工作中的应用。 一、典型VRRP虚拟网关拓扑 相比于传统单网关&#xff0c;采用VRRP虚拟网关…

Qt/C++编写的mqtt调试助手使用说明

一、使用说明 第一步&#xff0c;选择协议前缀&#xff0c;可选mqtt://、mqtts://、ws://、wss://四种&#xff0c;带s结尾的是走ssl通信&#xff0c;ws表示走websocket通信。一般选默认的mqtt://就好。第二步&#xff0c;填写服务所在主机地址&#xff0c;可以是IP地址也可以…

2024.10月11日--- SpringMVC拦截器

拦截器 1 回顾过滤器&#xff1a; Servlet规范中的三大接口&#xff1a;Servlet接口&#xff0c;Filter接口、Listener接口。 过滤器接口&#xff0c;是Servlet2.3版本以来&#xff0c;定义的一种小型的&#xff0c;可插拔的Web组件&#xff0c;可以用来拦截和处理Servlet容…

Python 自动排班表格(代码分享)

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

CentOS安装NVIDIA驱动、CUDA以及nvidia-container-toolkit

0.提前准备 0.1.更新yum源&#xff08;以阿里为例&#xff09; 0.1.1 备份当前的yum源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 0.1.2 下载新的CentOS-Base.repo 到/etc/yum.repos.d/ CentOS 5 wget -O /etc/yum.repos.d/CentOS-Base…

ORM框架简介

什么是ORM&#xff1f; ORM&#xff08;Object-Relational Mapping&#xff0c;对象关系映射&#xff09;是一种编程技术&#xff0c;用于在关系数据库和对象程序语言之间转换数据。ORM框架允许开发者以面向对象的方式来操作数据库&#xff0c;而不需要编写复杂的SQL语句。简单…

【Linux】命令行下的增删查改之“查看”

致谢:Linux常用命令大全(手册) – 真正好用的Linux命令在线查询网站 提供的命令查询 头部内容获取(head) head命令的功能是显示文件开头的内容&#xff0c;默认值为前10行。 指令参数&#xff1a; -n 定义显示行数 -c 指定显示头部内容的字符数 -v 总是显示文件名的头信…

告别手动计数:智能统计模型用量,释放设计潜力

添加HanTop-MKT&#xff0c;免费获取统计零件数量模型 非标设备行业的设计BOM因为涉及物料采购与装配数量要求&#xff0c;往往面临着需要数据准确性的严格要求&#xff0c;在缺乏自动化工具情况下&#xff0c;手动统计零件用量变得更加困难&#xff0c;且数据准确性得不到保障…

【uniapp】设置公共样式,实现公共背景等

目录 1、 全局渐变背景色 2.1 创建common目录 2.2 在common下新建style和images等目录 2.3 在style下新建common-style.scss 2.4 common-style输入全局渐变颜色 2.5 引入样式 2.6 业务页面引入 2.7 展示 2、全局字体颜色 2.1 新建base-style.scss文件 2.2 设置base-…

07 django管理系统 - 部门管理 - 搜索部门

在dept_list.html中&#xff0c;添加搜索框 <div class"container-fluid"><div style"margin-bottom: 10px" class"clearfix"><div class"panel panel-default"><!-- Default panel contents --><div clas…

Redis 其他类型 渐进式遍历

我们之前已经学过了Redis最常用的五个类型了&#xff0c;然而Redis还有一些在特定场景下比较好用的类型 Redis最关键的五个数据类型&#xff1a; 上面的类型是非常常用&#xff0c;很重要的类型。 除此之外的其他类型不常用&#xff0c;只是在特定的场景能够发挥用处&#…

无极低码课程【java(jdk)windows下安装及环境变量配置】

在Windows环境中安装JDK 7教程 Java Development Kit (JDK) 是开发Java应用程序所必需的工具包。本教程将指导您在Windows操作系统上安装JDK 7。 准备工作 下载JDK 7安装包 访问 Oracle官方网站 下载JDK 8的安装包。选择适合您操作系统的安装包(例如 jdk-7u80-windows-x64.ex…

vmware虚拟机 报错:客户机操作系统已禁用 CPU,请关闭或重置虚拟机 的解决方法

打开cpu虚拟化全部进行勾选 ctrl e 进行关机 勾选上打开就好了 如果没有那个选项 关机>打开虚拟机>管理>更改硬件兼容性> 往小处改改> >更改此虚拟机

[LeetCode] 515. 在每个树行中找最大值

题目描述&#xff1a; 给定一棵二叉树的根节点 root &#xff0c;请找出该二叉树中每一层的最大值。 示例1&#xff1a; 输入: root [1,3,2,5,3,null,9] 输出: [1,3,9]示例2&#xff1a; 输入: root [1,2,3] 输出: [1,3]提示&#xff1a; 二叉树的节点个数的范围是 [0,10…