MySQL进阶_1.数据类型约束

news2024/11/27 11:34:03

文章目录

  • 第一章、名词解释
  • 第二章、数据类型
    • 2.1、数据类型简介
    • 2.2、数据类型对应属性
    • 2.3、整数类型
    • 2.4、浮点类型
    • 2.5、定点数类型
    • 2.6、日期和时间类型
    • 2.7、文本字符串类型
      • 2.7.1、CHAR和VARCHAR区别
      • 2.7.2、TEXT
    • 2.8、小结和建议
  • 第三章、约束
    • 3.1 约束的定义
    • 3.2 非空约束
    • 3.3 唯一性约束
    • 3.4 主键约束
    • 3.5 自增列
    • 3.6 外键约束
    • 3.7 CHECK约束
    • 3.8 DEFAULT约束

第一章、名词解释

名词解释举例
DDL(DataDefinitionLanguage)数据定义语言用来创建数据库中的各种对象–表、视图、索引等。create,drop,truncate,alter,show,desc
DML(DataManipulationLanguage)数据操作语言insert、delete、update、select
DQL(DataQueryLanguage)数据查询语言基本结构是由SELECT子句,FROM子句,WHERE子句组成的查询块
DCL(DataControlLanguage)数据控制语言用来授予或回收访问数据库的某种特权,并控制数据库操纵事务发生的时间及效果,对数据库实行监视等。rollback,commit

第二章、数据类型

2.1、数据类型简介

在这里插入图片描述

2.2、数据类型对应属性

在这里插入图片描述

2.3、整数类型

在这里插入图片描述

  • 宽度
CREATE TABLE test_int(
f1 INT,
f2 INT(5),
f3 INT(5) ZEROFILL
);

INSERT INTO test_int(f1,f2) 
VALUES(123,123),(123456,123456);

INSERT INTO test_int(f3) 
VALUES(123),(123456);

SELECT * FROM test_int;

1.显示宽度在有ZEROFILL时才有用,如果数据宽度 < 字段定义宽度,则前面使用0填充。
2.除此之外,及时定义了字段宽度,只要数据不超过字段类型本身的范围,就可以成功插入表中。
3.从MySQL8.0.17开始,整数数据类型不推荐使用显示宽度属性

  • 适用场景

在这里插入图片描述

  • 选择方法
    考虑存储空间可靠性的平衡问题,要是为了节省存储空间,使用的整数类型取值范围太小,一旦遇到超出取值范围的情况,可能引起系统错误,影响可靠性。实际上,系统故障产生的成本远远超过增加几个字段存储空间所产生的成本

2.4、浮点类型

在这里插入图片描述

  • 为什么MySQL的浮点数类型会存在误差?

在这里插入图片描述

在一些对精度要求较高的项目中,千万不要使用浮点数。MySQL提供了精准数据类型:DECIMAL

2.5、定点数类型

在这里插入图片描述

1.定义DECIMAL(5,2)的类型,表示该列取值范围为-999.99~999.99
2.定点数在MySQl里是以字符串的形式存储的,这就决定了它一定是精准的
3.如果定点数类型不指定精度和标度时,默认为(10,0)
4.如果数据的精度超出定点数的数据精度范围时,MySQl同样会进行四舍五入处理。

2.6、日期和时间类型

在这里插入图片描述

  • TIME

在这里插入图片描述
使用CURRENT_TIME()NOW()函数,会插入当前系统的日期。

  • DATE

使用CURRENT_DATE()NOW()函数,会插入当前系统的日期。

  • DATETIME,TIMESTAMP
    在这里插入图片描述
    使用CURRENT_TIMESTAMP()NOW()函数,会插入当前系统的日期时间。
  • 开发经验
    在这里插入图片描述

2.7、文本字符串类型

在这里插入图片描述

2.7.1、CHAR和VARCHAR区别

1.CHAR

  • 如果保存时,数据实际长度比声明的长度小,则会在右侧填充空格以达到指定长度。
  • 当MySQL检索CHAR类型的数据时,CHAR类型的数据会去除尾部的空格

2.VARCHAR

  • VARCHAR(M)定义时,必须指定长度M,否则报错。
  • MySQL4.0版本以下,varchar(20)指的是20字节,如果存放UTF8汉字,只能存6个(每个汉字三个字节)。MySQL5.0版本以上,varchar(20)指的是20个字符
  • 检索VARCHAR类型的字段数据时,会保留数据尾部的空格

3.开发经验在这里插入图片描述

2.7.2、TEXT

  • 在向TEXT类型的字段保存和查询数据时,系统自动按照实际长度存储,不需要预先定义长度。
  • 由于实际存储的长度不确定,MySQL不允许TEXT类型的字段做主键。

2.8、小结和建议

在这里插入图片描述

第三章、约束

3.1 约束的定义

约束是对表中字段的限制。

约束按照作用范围可以分为:列级约束和表级约束
列级约束:声明在对应字段的后面
表级约束:在表中所有字段都声明完,在所有字段的后面声明

3.2 非空约束

1.作用
限定某个字段/列的值不为空

2.关键字

NOT NULL

3.特点

  • 所有类型的值都可以为NULL,包括INTFLOAT等数据类型
  • 非空约束只能出现在表对象的列上,只能某个列单独限制为非空,不能组合非空
  • ‘’空字符串不等同于NULL,0也不是NULL

3.3 唯一性约束

1.作用
限制某个字段/列的值不能重复,允许出现多个空值:NULL

2.关键字

UNIQUE

3.特点

  • 同一个表可以有多个唯一约束
  • 唯一约束可以是某个列的值唯一,也可以是多个列组合的值唯一
  • 唯一性约束允许列值为空
  • 在创建唯一约束的时候,如果没有给唯一约束命名,则默认和列名相同
  • MySQL会给唯一约束的列上默认创建一个唯一索引

4.举例

CREATE TABLE user(
  id INT,
  user_name VARCHAR(15),
  user_password VARCHAR(25),

  // 表级约束,复合的唯一索引
  CONSTRAINT uk_user_name_password UNIQUE(user_name,user_password)

3.4 主键约束

1.作用
用来唯一标识表中的一行记录

2.关键字

PRIMARY KEY

3.特点

  • 主键约束相当于唯一约束和非空约束的组合,主键约束列不允许重复,也不允许出现空值
  • 一个表最多只能有一个主键约束,建立主键约束可以在列级别创建,也可在表级别上创建
  • 主键约束对应着表中的一列或多列(复合主键)
  • 如果是多列组合的复合主键约束,那么这些列都不允许为空值,并且组合的值不允许重复
  • 当创建主键约束时,系统默认会在所在列或列组合上建立对应的主键索引(能够根据主键查询的,就根据主键查询,效率更高)。如果删除主键约束了,主键约束对应的索引就自动删除了。
  • 需要注意的一点是,不要修改主键字段的值。因为主键是数据记录的唯一标识,如果修改了主键的值,就有可能会破坏数据的完整性。

3.5 自增列

1.作用
某个字段的值自增

2.关键字

AUTO_INCREMENT

3.特点和要求

  • 一个表最多只能有一个自增列
  • 当需要产生唯一标志或顺序值时,可设置自增长
  • 自增长列约束的列必须是键列(主键或唯一键列)
  • 自增约束的列的数据类型必须是整数类型

4.新特性

CREATE TABLE test(
 id INT PRIMARY KEY AUTO_INCREMENT
);

INSERT INTO test(id)
VALUES(0),(0);

SELECT * FROM test;

DELETE FROM test WHERE id = 2;

INSERT INTO test(id)
VALUES(0);

在这里插入图片描述

此时再将id=3的记录删除,重启服务器,在MySQL5.7版本中再新增数据,id将从2开始,而MySQL8.0版本将从4开始。

  • 在MySQL5.7系统中,对于自增主键的分配规则,是由InnoDB数据字典内部一个计数器来决定的,而该计数器只在内存中维护,并不会持久化到磁盘中。当数据库重启时,该计数器会被初始化。
  • MySQL8.0将自增主键的计数器持久化到重做日志中。每次计数器发生变化,都会将其写入到重做日志中,如果数据库重启,InnoDB会根据日志中的信息来初始化计数器的内存值。

3.6 外键约束

1.作用
限定某个表的某个字段的引用完整性。
比如:员工表的员工所在部门的选择,必须在部门表能找到对应部分。
在这里插入图片描述

2.关键字

FOREIGN KEY

3 .主表和从表/父表和子表
主表(父表)︰被引用的表,被参考的表
从表(子表)︰引用别人的表,参考别人的表

4.特点

  • 从表的外键列,必须引用/参考主表的主键列或唯一约束列,因为被依赖/参考的值必须是唯一的
  • 在从表中指定外键约束,并且一个表可以建立多个外键约束
  • 从表的外键列与主表被参照的列名字可以不相同,但是数据类型必须一样,逻辑意义必须一致
  • 当创建外键约束时,系统默认会在所在列上建立对应的普通索引(根据外键查询效率很高)

5.使用示例

create table 主表名称(
  字段1 数据类型 primary key,
  字段2 数据类型 
);

create table 从表名称(
  字段1 数据类型 primary key,
  字段2 数据类型,
  CONSTRAINT 外键约束名 FOREIGN KEY(从表的某个字段) references 主表名(被参考字段) 
);

6.注意事项

在MysQL里,外键约束是有成本的,需要消耗系统资源。对强大并发的SQL操作,有可能会不适合。比如大型网站的中央数据库,可能会因为外键约束的系统开销而变得非常慢。所以,MySQL允许你不使用系统自带的外键约束,在应用层面完成检查数据一致性的逻辑。也就是说,即使你不用外键约束,也要想办法通过应用层面的附加逻辑,来实现外键约束的功能,确保数据的一致性。

7.阿里开发规范

【强制】不得使用外键与级联,一切外键概念必须在应用层解决。

说明:(概念解释)学生表中的student_id是主键,那么成绩表中的student_id则为外键。如果更新学生表中的studrnt_id,同时触发成绩表中的student_id更新,即为级联更新。外键与级联更新适用于单机低并发,不适合分布式、高并发集群﹔级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。

3.7 CHECK约束

1.作用
检查某个字段的值是否符合xx要求,一般指的是值的范围(比如salary > 2000 )。
2.关键字

CHECK

3.说明
MySQL5.7 可以使用check约束,但是check约束对数据验证没有任何作用。添加数据时,没有任何错误或警告,但是MySQL8.0 可以使用check约束。

3.8 DEFAULT约束

1.作用
给某个字段/列指定默认值,一旦设置默认值,在插入数据时,如果此字段没有显式赋值,则赋值为默认值。

2.关键字

DEFAULT

3.说明
为什么建表时,加not null default''default 0?
答:不想让表中出现null值。

  • 不好比较,null是一种特殊值,比较时只能用专门的is null和is not null来比较。碰到运算符,通常返回null;
  • 效率不高。影响提高索引效果;

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

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

相关文章

浅谈OV SSL 证书的优势

随着网络威胁日益增多&#xff0c;保护网站和用户安全已成为每个企业和组织的重要任务。在众多SSL证书类型中&#xff0c;OV&#xff08;Organization Validation&#xff09;证书以其独特的优势备受关注。让我们深入探究OV证书的优势所在&#xff0c;为网站安全搭建坚实的防线…

内网安全学习

域 域在我的理解就是一个局域网&#xff0c;管理员为了便于操作域内主机&#xff0c;通常会有一个DC&#xff08;domain control&#xff09;&#xff0c;域控主机可以直接控制其他域内主机&#xff0c;相当于域内的管理员权限&#xff0c;内网渗透的终极目的即拿到域控的权限…

嵌入式学习笔记(41)实时时钟RTC

7.6.1何为实时时钟 (1)real time clock&#xff0c;真实时间&#xff0c;就是所谓的xx年x月x日x时x分x秒星期x (2)RTC是SoC中一个内部外设&#xff0c;RTC有自己独立的晶振提供RTC时钟源&#xff08;32.768KHz&#xff09;&#xff0c;内部有一些寄存器用来记录时间&#xff…

Acwing 842. 排列数字

Acwing 842. 排列数字 知识点题目描述思路讲解代码展示 知识点 DFS 题目描述 思路讲解 DFS重点是&#xff1a;顺序&#xff01;&#xff08;暴力的手法&#xff09;&#xff08;递归&#xff09; 用 path 数组保存排列&#xff0c;当排列的长度为 n 时&#xff0c;是一种方…

pandas读取文件的时候出现‘OSError: Initializing from file failed’

报错原因&#xff1a; pandas.read_csv() 报错 OSError: Initializing from file failed&#xff0c;一般由两种情况引起&#xff1a;一种是函数参数为路径而非文件名称&#xff0c;另一种是函数参数带有中文。 原代码&#xff1a; data pd.read_csv(csv文件.csv) data导入文…

拒绝水文!八大排序(一)【适合初学者】直接插入排序和希尔排序

文章目录 直接插入排序希尔排序 大家好&#xff0c;我是纪宁。 这篇文章将向大家介绍直接插入排序算法和希尔排序算法。 直接插入排序 直接插入排序是一个简单的插入排序法&#xff0c;其基本思想是&#xff1a;把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有…

[中间件~大厂面试题] 腾讯三面,40亿的QQ号如何去重

前言&#xff1a; 在Spring Boot框架下&#xff0c;可以使用以下方法来去重40亿个QQ号.请注意&#xff1a;QQ号码的理论最大值为 2 32 − 1 2^{32} - 1 232−1&#xff0c;大概是43亿左右。 文章目录 提前总结(总分总&#xff5e;&#xff5e;&#xff5e;)最粗鲁的方式1. 使用…

深入理解Linux网络笔记(二):内核和用户进程协作之阻塞方式

本文为《深入理解Linux网络》学习笔记&#xff0c;使用的Linux源码版本是3.10&#xff0c;网卡驱动默认采用的都是Intel的igb网卡驱动 Linux源码在线阅读&#xff1a;https://elixir.bootlin.com/linux/v3.10/source 2、内核是如何与用户进程协作的&#xff08;一&#xff09; …

疯 狂 的 文 件 夹 【收藏起来】

文章目录 &#x1f4c1;故事的开始&#x1f4c1;一起疯狂&#x1f4da;资源领取 专栏Python零基础入门篇&#x1f525;Python网络蜘蛛&#x1f525;Python数据分析Django基础入门宝典&#x1f525;小玩意儿&#x1f525;Web前端学习tkinter学习笔记Excel自动化处理 &#x1f4…

力扣-345.反转字符串中的元音字母

Idea 将s中的元音字母存在字符串sv中&#xff0c;并且使用一个数组依次存储元音字母的下标。 然后将字符串sv进行反转&#xff0c;并遍历元音下标数组&#xff0c;将反转后的字符串sv依次插入到源字符串s中 AC Code class Solution { public:string reverseVowels(string s) {…

力扣 -- 1049. 最后一块石头的重量 II(01背包问题)

参考代码&#xff1a; 未优化代码&#xff1a; class Solution { public:int lastStoneWeightII(vector<int>& stones) {int nstones.size();int sum0;for(const auto& e:stones){sume;}int aimsum/2;//多开一行&#xff0c;多开一列vector<vector<int&g…

排序---P1116 车厢重组

P1116 车厢重组 来自 <车厢重组 - 洛谷> 其实这道题本质上就是求逆序对的过程&#xff1a; 两种方法&#xff1a;一个是通过冒泡排序过程求逆序对&#xff1b;一个是通过归并排序过程求逆序对。 法一&#xff1a;当通过冒泡排序进行正序排列时&#xff0c;相邻两个数需要…

批量将文件名称符合要求的文件自动复制到新文件夹:Python实现

本文介绍基于Python语言&#xff0c;读取一个文件夹&#xff0c;并将其中每一个子文件夹内符合名称要求的文件加以筛选&#xff0c;并将筛选得到的文件复制到另一个目标文件夹中的方法。 本文的需求是&#xff1a;现在有一个大的文件夹&#xff0c;其中含有多个子文件夹&#x…

Redis与分布式-集群搭建

接上文 Redis与分布式-哨兵模式 1. 集群搭建 搭建简单的redis集群&#xff0c;创建6个配置&#xff0c;开启集群模式&#xff0c;将之前配置过的redis删除&#xff0c;重新复制6份 针对主节点redis 1&#xff0c;redis 2&#xff0c;redis 3都是以上修改内容&#xff0c;只是…

C++位图—布隆过滤器

目录 位图概念位图应用 布隆过滤器简介布隆过滤器的优缺点布隆过滤器应用场景布隆过滤器实现布隆过滤器误判率分析 总结 位图概念 位图是一种数据结构&#xff0c;用于表示一组元素的存在或不存在&#xff0c;通常用于大规模数据集的快速查询。它基于一个位数组&#xff08;或位…

管理经济学基本概念(二): 规模经济、需求曲线、供给曲线等

1、关键术语 1.1、边际报酬递减规律 边际报酬递减规律是指随着产出量的扩大&#xff0c;边际生产率(与增量投入要素相联系的增量产出量)最终会下降。 递增的边际生产率意味着边际成本递增。 递增的边际成本最终导致平均成本递增。 1.2、规模经济 (1) 如果长期平均成本相对…

打开泰坦陨落2找不到msvcp120.dll无法执行代码/msvcr120.dll丢失修复方法

msvcp120.dll 是 Windows 操作系统中的一个动态链接库文件&#xff0c;对于许多程序和游戏的运行起着至关重要的作用。然而&#xff0c;有时候我们可能会遇到 msvcp120.dll 丢失的情况&#xff0c;导致电脑出现各种问题。本文将详细介绍 msvcp120.dll 丢失的四种解决方法&#…

【项目】5.1阻塞和非阻塞、同步和异步 5.2Unix、Linux上的五种IO模型

5.1阻塞和非阻塞、同步和异步&#xff08;网络IO&#xff09; 典型的一次IO的两个阶段是什么&#xff1f;数据就绪和数据读写 数据就绪&#xff1a;根据IO操作的就绪状态 阻塞非阻塞 数据读写&#xff1a;根据应用程序和内核的交互方式 同步异步 陈硕&#xff1a;在处理IO的…

【小沐学Python】各种Web服务器汇总(Python、Node.js、PHP、httpd、Nginx)

文章目录 1、Web服务器2、Python2.1 简介2.2 安装2.3 使用2.3.1 http.server&#xff08;命令&#xff09;2.3.2 socketserver2.3.3 flask2.3.4 fastapi 3、NodeJS3.1 简介3.2 安装3.3 使用3.3.1 http-server&#xff08;命令&#xff09;3.3.2 http3.3.3 express 4、PHP4.1 简…

选择排序算法:简单但有效的排序方法

在计算机科学中&#xff0c;排序算法是基础且重要的主题之一。选择排序&#xff08;Selection Sort&#xff09;是其中一个简单但非常有用的排序算法。本文将详细介绍选择排序的原理和步骤&#xff0c;并提供Java语言的实现示例。 选择排序的原理 选择排序的核心思想是不断地从…