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进行复制, 输…

golang语法

参考链接&#xff1a;https://www.runoob.com/go/ 创建变量 // 3种方法 var a int a : 10 // 类型推断 a : make() // 复合类型循环 // 3种循环 for i : 0; i < 10; i {// 循环体} // 传统for循环 for index, num : range nums {// 循环体} // nums是可迭代的复合类型…

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

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

k8s介绍-搭建k8s

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

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

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

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

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

得了自闭症怎么办

当孩子被诊断为自闭症时&#xff0c;家长们往往会感到迷茫、无助和焦虑。然而&#xff0c;自闭症并不是无法逾越的障碍&#xff0c;通过科学的干预和支持&#xff0c;自闭症儿童可以取得显著的进步&#xff0c;过上有质量的生活。在这个过程中&#xff0c;专业的机构如星贝育园…

取消apply_async调度的任务

在 Celery 中&#xff0c;使用 apply_async 方法调度的任务可以通过任务 ID 来取消。以下是如何取消 apply_async 调度的任务的详细步骤&#xff1a; 1. 获取任务 ID 当你使用 apply_async 方法调度任务时&#xff0c;它会返回一个 AsyncResult 对象&#xff0c;该对象包含任…

C++ 面向对象、特征、重载和重写、构造和析构、向上和向下转型、深浅拷贝。

什么是面向对象&#xff08;Object-Oriented Programming, OOP&#xff09; 1.面向对象是一种编程范式&#xff0c;它通过将软件系统的设计和开发分解为“对象”&#xff08;Object&#xff09;的方式来实现更好地组织代码。面向对象的核心思想是将程序的结构分为对象&#xf…

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…

Java比较两个Excel是否内容一致

领导每天让比较两个Excel中的内容&#xff0c;为了节省工作效率多摸鱼&#xff0c;就写了个java接口&#xff0c;通过上传两个文件 进行代码比较得到详细的比较结果(这个需要自己根据日志二开) 目前只实现了比较功能 话不多说直接上代码&#xff0c;具体看注释 package com.yx…

ORM框架简介

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

2. 继承Mono的单例模式基类

前提 继承MonoBehaviour的脚本不能new继承MonoBehaviour的脚本一定得依附在GameObject上 实现挂载式的单例模式基类 挂载式 继承Mono的单例模式基类 /// <summary> /// 挂载式 继承Mono的单例模式基类 /// </summary> /// <typeparam name"T">&…

B2050 三角形判断

题目描述 给定三个正整数&#xff0c;分别表示三条线段的长度&#xff0c;判断这三条线段能否构成一个三角形。 输入格式 输入共一行&#xff0c;包含三个正整数&#xff0c;分别表示三条线段的长度&#xff0c;数与数之间以一个空格分开。&#xff08;三条边的长度均不超过…

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

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