MySQL详解:数据类型、约束

MySQL

  • 1. 数据类型
    • 1.1 数值类型
      • 1.1.1 bit 位类型
      • 1.1.2 整数数据类型
      • 1.1.3 小数类型
        • float
        • decimal
    • 1.2 字符类型
      • 1.2.1 char
      • 1.2.2 varchar 可变长字符串
      • 1.2.3 日期和时间类型
        • date
        • datetime
        • timestamp
      • 1.2.4 enum
      • 1.2.5 set
      • 集合查询函数 find_in_set
  • 2. 表的约束
    • 2.1 NULL 空属性
    • 2.2 默认值
    • 2.3 zerofill 属性
    • 2.4 primary key 主键
      • 2.4.1主键的创建
      • 2.4.2 主键的删除 操作
      • 2.4.3 复合主键
    • 2.5 unique 唯一键
      • 唯一键的创建
      • 唯一键的删除操作
    • 2.6 foreign key 外键
      • 外键的创建
      • 外键的删除

1. 数据类型

1.1 数值类型

1.1.1 bit 位类型

语法:

bit(M)
  • bit :位字段类型,M表示设置的位数大小(M 不填写,bit 默认值大小为1),字段大小取值(1~64)

由于bit 位字段,只能存储 0或1,由此 bit 字段常用于存储:二进制值、bool值。

注意:bit 位字段在表中显示是按照 ASCLL码对应的值进行显示的

下面来举个例子:

创建 t1 表,在 t1 表中设置一个大小为8的位字段 b,然后插入 10数值,来看看表中内容:

在这里插入图片描述

在这里显示不出来对应的数值 10

下面再来试试插入数值为 65 ,对应ASCLL码表中的 A 字符,输出内容:

在这里插入图片描述

验证了 bit 字段在显示内容时,只能按照 ASCLL码表中的内容进行显示

1.1.2 整数数据类型

  • 整数字段类型包含以下几个字段:tinyint、smallint、mediumint、int、bigint 等等

下图是不同字段的取值范围以及占用的字符大小:
在这里插入图片描述

下面以 tinyint 字段进行展开介绍:

语法:

tinyint 
tinyint unsigned

tinyint 字段有符号整数大小取值范围:(-128 ~ 127);无符号整数大小取值范围:(0 ~ 255)

下面创建 t2 表,表中设置 num 为 tinyint类型字段,分别插入数值为边界值和越界值看看对应结果:

在这里插入图片描述
在这里插入图片描述

插入边界值 MySQL没有报错。但是,对于插入超过 tinyint 范围大小的数值MySQL会毫不犹豫直接拦截。

下面再来测试一下MySQL针对 tinyint 无符号整数取值限制:

在这里插入图片描述

结果和 tinyint 有符号字段类型一样。

在整数数据中,尽量不使用unsigned,使用有符号整数的数据类型还可以存储负数。对于 tinyint 类型可能存放不下的数据,tinyint unsigned 同样可能存放不下,与其如此,还不如设计时,将 tinyint 类型提升为bigint类型 。

剩下的其他字段类型就不一一举例了,使用方式和 tinyint 一致,不一样的就是存储范围更大了。在对于场景使用挑选对应的类型字段即可。

1.1.3 小数类型

float

语法:

float
float(M, d)
float(M, d) unsigned
  • float:浮点类型字段,M 表示显示的长度(不包含小数点),d 指定小数位数,float 字段占用4字节空间

float 字段没有设置 M 显示长度和 d 指定小数部分,那么 float 默认可以存储 7位精度的小数。(存储小数的小数位数大于7位,会发生精度丢失的情况)

注意:存储浮点数的小数部分超过 d 指定的小数位数,MySQL在保存值时会发生四舍五入

举例:创建新表 t3 ,t3 表存有 folat 浮点字段 salary 设置为(4,3),分别插入边界数值以及越界数值:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如上显示,插入小数部分 超过2位后, MySQL 会将多出来小数部分进行四舍五入处理;但是插入数值整数部分超过3位后,MySQL 会即刻报错,因为显示内容 M 是 4 位,输出内容时,不管怎么样小数部分都要显示两位,那么剩下两位只能给整数部分了。

这也是为什么,插入诸如 99.995、99.996… / (-99.995、-99.996… ) 这些数值时会报错了。小数部分超过三位发生四舍五入,进位后变成 100.00 超出显示设置要求直接报错。

这也可以得出一个结论在设置 float 字段类型时,(M, d)直接决定了当前 float 字段的取值范围;
如上,float(4, 2)取值范围 :(-99.99 ~ 99.99)

  • float 无符号类型会将存储负数范围的小数直接去除,只剩下正数小数部分的存储范围

举例,将上面表中的 salary 字段的类型更改为 float 无符号类型,分别插入正数小数和负数小数:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

将 float 设置成无符号类型后,MySQL不允许插入有关任何负数以及负数小数值,甚至超过显示数值 4 的小数也不允许插入

如:float(4,2) unsigned 取值范围为:(0 ~ 99.99)

decimal

语法:

decimal
decimal(M, d)
decimal(M, d) unsigned
  • decimal:是用于存储浮点数的字段,与 float 不同的是 decimal 存储小数的精度会高

默认情况下 decimal 最大位数为 65。储存小数最大位数 d 是 30 位(如果 M 不设置,默认为显示 10 ; d 位不设置,默认为0)

在介绍 float 的时候提到过, float 不指定 M 显示长度和 d 小数位数时,默认最大存储小数位数为 7 位。

decimal 使用方法和 float 一致,在这里就不一一举例了,下面主要介绍两者存储小数精度上的区别。

下面来验证一下 float 和 decimal 小数精度存储情况:

分别将 float 和 decimal 存储小数进度设置为 8 位,插入数值后对比
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

由上也体现了 decimal 存储小数的精度比 float 高。

float 和 decimal 选择取决于业务的处理,如果希望小数的精度高,那么就使用 deimal

1.2 字符类型

1.2.1 char

语法:

char(L)
  • char:固定长度字符串,L是可以存储的长度,单位为字符,取值范围(1 ~ 255)

注意:MySQL 中的 char 要与编程语言中的 char 关键字作区分,char 存储单元为字符,并不是字节

举例,创建 一个以 char(2)为类型的 name 字段,分别插入对应值,检测该字段存储空间的范围:

在这里插入图片描述
在这里插入图片描述

插入三个以上的字符 MySQL 会直接拦截,这个可以理解,毕竟是超出范围了。从上面显示内容也可以看出,插入存储的是字符,并不是以字节为空间存储。

再来测试一下 char 所允许开辟的最大空间:

在这里插入图片描述

char 所能够最大开辟空间是 255 ,超出这个上限 MySQL 会直接报错

1.2.2 varchar 可变长字符串

varchar 字段创建方式和 char 字段创建方式一样,具体方法可以参考 char 字段的创建。

下面主要来介绍 varchar 中的细节:

语法:

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

注意:varchar 可变字符串的最大长度指的是字节,并不是字符

为什么要强调是字节呢?

varchar 会拿出(1 - 3 )个字节用于记录数据大小,除去这3个字节后,不同编码占用的字节数也会不一样:

  1. 当表的编码是 utf8 时(一个字符占用3个字节),varchar(n) 的参数 n 最大值是 65532/3=21844
  2. 当表的编码是 gbk 时(一个字符占用2个字节),varchar(n) 的参数 n 最大值是 65532/2=32766

下面来验证,在不同编码下创建 varchar 最大存储字符空间:

在 utf8 编码格式下创建 varchar最大存储字符空间 21844:
在这里插入图片描述
在 utf8 编码格式下,创建 varchar 存储空间超出 21844 个字符:
在这里插入图片描述

在 gbk 编码格式下创建 varchar 最大存储字符空间 32766:
在这里插入图片描述
在 gbk 编码格式下,创建 varchar 存储空间超出 32766个字符:
在这里插入图片描述

char 和 varchar 选择:

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

1.2.3 日期和时间类型

date
date
  • date:显示日期(yyyy-mm-dd),占用3个字节存储空间

注意:插入日期是按照字符串数据形式进行插入

示例:

在这里插入图片描述
在这里插入图片描述

当然我们也可以使用其他形式插入对应的日期,但是最后显示的日期最后都会以标准的(yyyy-mm-dd)输出:

在这里插入图片描述

不过为了数据的准确性,推荐还是按照标准的格式进行插入

datetime
datetime
  • datetime:时间日期格式(yyyy-mm-dd HH:ii:ss),占用八字节

示例:

在这里插入图片描述

datetime 的时间日期数据格式也没有严格的标准,用户都可以自定义。但是输出内容会默认按照标准格式进行输出:

在这里插入图片描述

timestamp
timestamp
  • timestamp :时间戳,从1970年开始,时刻变化,格式:( yyyy-mm-dd HH:ii:ss ),占用四字节

与前面两个时间类型不同的是,timestamp 不需要用户手动去插入数值。

当一张表设置了 timestamp 类型字段,每次插入新的内容,又或者更新了新的其他字段的数值,timestamp 对应的字段都会更新。

示例:

在这里插入图片描述
在这里插入图片描述
更新数据:
在这里插入图片描述

1.2.4 enum

语法:

enum('选项1', '选项2', '选项3', ...);
  • enum:枚举,犹如做单选题,多个选项选择其中一个选项,选项最多可设置 65535 个

在 MySQL 中,出于效率考虑,enum 选项存储的值实际存储的是“数字”

学过C/C++的老铁应该对 enum 关键字不陌生,有所不同的是在 MySQL 中 enum 的值是从 1 开始;
(选项1 、选项2 、选项3 …分别对应数字: 1、2、3… )

示例:

  1. 创建 votes表,设置 name 和 gender 字段:
    在这里插入图片描述
  2. 插入内容:
    在这里插入图片描述
    当然我们也可以在 gender 字段中,输入数字进行插入:
    在这里插入图片描述
    如果输入的内容超出 gender 字段选项范围 MySQL会直接报错:
    在这里插入图片描述

1.2.5 set

语法:

set('选项1', '选项2', '选项3', ...);
  • set:集合,犹如多选题,可以选择多个选项,set 类型最多能设置 64 个选项

set 选项存储的值也是数字,但是这里的数字与枚举数字是有差异的。

set 中的每个选项对应的是位图:

每个字节都包含有 8 个比特位:0000 0000。
set 类型中的选项1,对应一个字节中的最右边第一个比特位
set 类型中的选项2,对应一个字节中的最右边第二个比特位
选项3、选项4 …依次从右往左对应一个比特位

往表中存有 set 字段插入内容时,设置一个选项,对应的比特位会被置于 1,没有被设置的选项对应比特位还是 0

示例:

  1. 创建表 votes1,设置 username 和 hobby 字段:
    在这里插入图片描述
  2. 插入内容:
    在这里插入图片描述
    当然,也可以按照 set 类型选项的数字要求进行插入:
    在这里插入图片描述

上面插入数据来看,如果按照数字的方式去设置 set 类型的字段,不利于我们去阅读,还要进行进制转换,这样的的方式是不建议的。

set 类型和 enum 类型一样,如果字段选项中没有对应的选项要求,插入其他内容会出现报错信息:

在这里插入图片描述

集合查询函数 find_in_set

上面提到了 set 集合类型,顺便来介绍一下集合查询函数 find_in_set

语法:

find_in_set(sub, str_list);
  • sub 是要查询的元素,str_list 是集合

如果 sub 元素在 str_list 集合中,那么这个函数就会将 sub 元素在 str_list 集合中的下标返回;(这里的下标是从1号开始)

如果 sub 元素不在 str_list 集合中,该函数会返回 0.

当然,使用 find_in_set 函数要配合 SQL 语句一起使用

在这里插入图片描述

下面来举例:

在这里插入图片描述
查询爱好篮球的人员,一般会这样查询:
在这里插入图片描述
现在更改要求,查询爱好中包含有篮球的人员,此时就要用到 集合查询函数了:
在这里插入图片描述

2. 表的约束

上述提到的数据类型是约束字段的大小、取值范围。数据类型约束字段方式比较单一,从业务逻辑角度保证数据的正确性是远远不够的,这时就需要一些额外的约束手段。

表的约束有很多,下面来介绍几个比较常用约束字段的方式:

2.1 NULL 空属性

空值代表的意思是,在某个字段进行插入操作时可以不用插入相应的值。可以存在有空的情况就会存在不能为空的情况:

  • 两个值:null(空)和 not null(不为空)

注意:要区分 null''""。在MySQL中,null 表示的是不存在、无值; '' "" 是一个长度为 0 的的字符串,表示一个值。记住 null'' ,不是同一个归类即可!

创建一张表,不对某个字段进行空值约束的设置默认创建的字段是可以存在空值:
在这里插入图片描述
可以看到默认创建表中的字段中是可以为空的,下面在来进行插入操作:
在这里插入图片描述

数据插入成功,但是仔细看看查询的结果很怪,没有对应的学生名字,怎么会有年龄甚至还有班级?很不符合正常的业务逻辑。因此在设计数据库表的结构的时候,一定要对表中设置限制,就是所谓的约束

在刚刚创建表的字段中,名字、学号、年龄、班级号在学生表中都是必须存在的,也就是不能设置为空的情况:
在这里插入图片描述
在这里插入图片描述
下面进行插入操作:
在这里插入图片描述

设置字段不能为空时,插入的数据必须存在否则会报错!

2.2 默认值

上面提到,当创建的的字段不去刻意设置空值时,MySQL 默认也会将这个字段默认设置为空值。

那么默认值可以修改吗?答案是可以的。

  • 默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值

用户输入了就用用户的,用户没有输入就用默认值

示例:创建一个t4的表,用于存储人的信息。年龄、性别分别设置有默认值:
在这里插入图片描述
可以看到表中的 age 与 gender 字段的默认值已经设置:
在这里插入图片描述
接下来插入一些数据看看:
在这里插入图片描述
查询插入的所有数据:
在这里插入图片描述

可以看到,在设有默认值的字段中,我们可以显示去插入一些数据,sql会优先使用插入的数据;如果没有显示的插入数据,就会使用到默认的值

下面来看这样的一种情况,空属性 与 默认值 同时存在同一字段:

创建 t5 表,将性别的字段同时设置 空属性与默认值:
在这里插入图片描述
下面来插入一些数据:
在这里插入图片描述
在这里插入图片描述

第一条与第二条数据正常插入,但是当第三条数据插入时,将姓别设置为空时就报错了

NOTE NULL 与 DEFAULT 不冲突,是相互补充的。当字段同时设置了 not null、default,插入列如果不存在,会使用默认值;插入列存在,但是为空时,会报错!

下面还有另一种情况:创建 t6 表,只设置一个字段,不设置任何约束,插入一些数据

在这里插入图片描述
上面的表,我没有设置 default ,为什么可以插入 null 值?

如果我们设置了字段,没有对这个字段设置任何的 default 默认值,MySQL 会自动生成 default ,并且设置为空:

在这里插入图片描述

2.3 zerofill 属性

字符串的长度表示可以容纳的字符的个数,浮点数的长度可以表示显示的精度。那么,有没有想过数字类型后面的长度有什么作用?

int 类型整数的大小为 4 个字节,那么 int(6) 表示什么意思? 直接设置变成 6 字节大小?

其实不然,数字类型的长度与存储的大小无关,它约束的是数值显示的长度。当然,在字段中要设置了 zerofill 属性才能发挥作用,不然数字类型设置了长度是没有任何作用的

下面来举个例子:创建一张 tt 表,设置两个整数的字段,一个设置有 zerofill 属性,另一个正常设置

在这里插入图片描述
在这里插入图片描述

下面插入一些数据,将其显示:

在这里插入图片描述

字段 a、b 整形都设置了长度,但是只有 a 字段设置了 zerofill 属性。可以看到查询显示的结果,a 字段长度设置为 5,长度不足 5 个长度,剩下的会用 0 填补显示。

  • zerofill 字段属性作用就是将数字类型的长度都显示出来,如果显示的数字小于显示长度,会用 0 进行补充

当然在MySQL内部,a 字段存储的内容还是原本那样,只是显示样子发生了改变。下面可以通过 hex 函数来证明:

在这里插入图片描述

2.4 primary key 主键

  • 主键primary key 用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键;主键所在的列通常是整数类型,设置其他类型会报错

2.4.1主键的创建

  1. 主键的创建可以是在建表的时候设置,示例:
create table tt13 ( id int unsigned primary key comment '学号不能为空', name varchar(20) not null);

在这里插入图片描述

就拿刚刚创建的 tt13 表来举例,直接对主键对应的字段进行重复数据的插入,看看结果:

在这里插入图片描述

在这里直接报错,主键约束对应的字段中不能重复,一旦重复,插入操作失败。

  1. 主键也可以在表创建之后进行追加设置,利用 alter 语句来进行修改表结构:
alter teble 表 add primary key(字段名);

来看示例,创建一张新的表:

create table tt14 (id int unsigned,name varchar(20) not null);

在这里插入图片描述
设置主键:

在这里插入图片描述

2.4.2 主键的删除 操作

主键的删除也是通过 alter 语句来设置:

alter teble 表 drop primary key;

注意:一张表中只能设置一个主键。所以在对表中的主键进行删除操作时,无需指明对应的字段,MySql 会直接删除主键

就拿上面的 tt14 表来演示删除主键的操作:
在这里插入图片描述

2.4.3 复合主键

上面提到,一张表中只能设置一个主键。但是,有些场景会要求多个字段都作为主键,这个时候就要用到复合主键了。

  • 复合主键:由两个或两个以上的字段组合而成的主键,用于唯一地标识表中的每一行记录

有一个点要声明一下:复合主键的字段组合值必须是唯一的,但每个单独的列值在表中可能不是唯一的

下面来举个创建主键的示例,创建这样的一个 tt15 表,其中将 id、course字段设置为复合主键:

 create table tt15(id int unsigned,course char(10) comment '课程代码',score tinyint unsigned default 60 comment '成绩',primary key(id, course) -- id和course为复合主键
);

实现效果如下:
在这里插入图片描述
下面来插入数据检验一下:
在这里插入图片描述

在插入前三条数据,id 和 course 字段中只要有一个字段的内容不同,都可以插入成功。一旦两个字段的数据都存在,再次插入相同数据时,就会报错。

复合主键也是主键,如何创建主键就如何删除复合键,在这里就不过多展示了。

2.5 unique 唯一键

在数据库中,并不是所有的数据都适合设置为主键的。

一张表中的主键值允许设置一个,针对一些数据,如果想这个字段的数据不能被重复,主键又被设置了,又该如何处理呢?

此时就要用到唯一键了:

  • 唯一键:唯一键的本质和主键功能差不多,用于标识字段的唯一的数据。与主键不同的是,唯一键可以设置为空,且一张表中字段可以设置多个唯一键

可以这样说:主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息出现重复。

举个例子:

每个人都有身份证,身份证作用是在整个国家中唯一标识你的身份一种信息。在公司中,公司为了更加好的管理员工,会给每个员工都设置一个工号。此时,这个工号也是唯一标识你的身份的。如果要设置一张用于存储员工信息的表,这两个字段都要进行唯一标识设置。主键在一张表中,只能被设置一次。这个时候,唯一键的作用就体现出来了。员工的身份证通过主键进行标识,工号进行唯一键进行标识即可。

唯一键既可以创建,也可以进行删除。具体来看下面的示例:

唯一键的创建

  • 在创建表的时候,设置唯一键

创建一张学生表,将学生的 id 设置为唯一键:

create table student (id char(10) unique comment '学号,不能重复,但可以为空',name varchar(10)
);

在这里插入图片描述

  • 在表创建之后,利用 alter 语句来修改表结构,设置唯一键

下面来创建一张 tt16 表,创建完成后设置唯一键:

create table tt16(id char(10),name varchar(10)
);

在这里插入图片描述

下面通过 alter 来设置唯一键:

alter table 表 add unique(字段名);

在这里插入图片描述
测试唯一键功能:
在这里插入图片描述
就拿上面的表进行测试,插入四条信息。一旦唯一键数据重复了,插入即刻报错。

唯一键的删除操作

删除唯一键也是用到了 alter 语句:

alter table 表 drop index 含唯一键的字段名

下面拿 tt16 表进行测试,将 id 字段的唯一键进行删除:
在这里插入图片描述

下面再进行数据的插入:
在这里插入图片描述
可以看到,id 字段的唯一键约束失效,001 的 id 数据可以进行多次插入。

2.6 foreign key 外键

  • 外键:用于建立和维护两个或多个表之间的关联关系

如何去理解上面的概念呢?多张表中的关联关系。

下面来举个例子:

一个年级的学科开设的班级个数是有限的。好比有一个年级有3个班,分别是 1班、2班 和 3班。
此时,要设计两张表:学生表、班级表。
一个学生的信息包含有:学号、姓名、成绩、班级号。
一个班级应该有的信息:班级名称,班级号。
仔细看两张表的信息,可以看到这两张表之间是存在关联的。那就是班级号,通过班级号就可以将两个表关联起来。这样就会导致一个问题,谁限制了谁?班级表限制了学生表?还是学生表限制了班级表?
学校的开设的班级是有上限的,不能说一个学生在不存在的 4班进行上课吧。由此,是班级表限制了学生表,每个学生都应该有对应的班级进行上课。

在这里举例的两张表中,班级表是主表,学生表是从表。外键用于定义主表和从表之间的关系

这里简单介绍一下主表、从表:

  • 主表:包含主要信息或关键信息的表。通常包含能够唯一标识记录的字段(主键)。
  • 从表:从表是包含与主表相关联的详细信息的表。通常包含一个或多个外键,这些外键指向主表的主键,从而建立了表之间的关联。

外键的创建

  • 在表创建的时候,设置外键

在这里要注意一点,创建外键的时候,一定一定要确定好两张表之间谁是主表,谁是从表。这个很重要,关系到数据存储的合理性。

上面举例中,如果是学生表为主表就会造成一个问题,不同的学生有各种班级。学校总共就几个班,多出来的哪里来?对此,合理的设计表之间的关联关系是很重要的。

由于外键是用于关联两张表之间的关系的,下面就来创建两张表:班级表、学生表

  1. 创建主表:班级表。将班级号设置为主键
create table class (id int primary key,name varchar(30) not null comment'班级名'
);
  1. 创建从表:学生表。学生号设置为主键,学生所在的班级设置为外键
create table student1 (id int primary key,name varchar(30) not null comment '学生名',class_id int,foreign key (class_id) references class(id)
);

在这里插入图片描述

  • 在表创建之后,设置两张表之间的关联关系
alter table 表名 add constraint 约束指定名
foregin key (从表字段) references 主表名(主表字段);

下面创建第二张学生表,在创表之后设置外键:

在这里插入图片描述
关联 class 主表 与 student2 从表,设置外键:
在这里插入图片描述

在表创建后,设置外键的细节稍微更多一些。下面通过插入一些数据来检验一下外键的约束:

  1. 先对班级表进行插入数据:
    在这里插入图片描述
  2. 对学生表进行数据的插入:
    在这里插入图片描述

插入一条小明的数据,当班级号大于 3 时,外键约束就体现出来了(整个学校,高一开设的班级就 3 个,插入一个不存在的班级,就很不合理)。

在这里还要提一个点:设置外键后,主表关联从表的字段的数据是不能随随便便进行删除的

示例:删除 class 的 id 字段对应的数据

在这里插入图片描述

class 表中的数据关联从表 student2,只要 student2 表的数据还存在,那么 class 表中的数据就不能进行删除操作!

外键的删除

  • 通过 alter 语句对外键约束进行删除
alter table 含有外键的表 drop foreign key 外键约束名;

查看外键约束名方法:

show create table 表名\G;

在上面示例中,我们是对从表进行了外键的设置,对此应该查看 student2 外键的约束:
在这里插入图片描述

删除 student2 表中的外键约束:
在这里插入图片描述
在这里插入图片描述

删除外键后,原本由外键约束保证的数据一致性将不再自动维护。

对于数据库的任何删除操作都要慎重考虑后再进行,数据是无价的

这篇文章就介绍到这里,喜欢的小伙伴可以点赞、收藏加关注。感谢老铁们的观看!

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

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

相关文章

基于鸿蒙API10的RTSP播放器(七:亮度调节功能测试)

目标: 当我的手指在设备左方进行上下移动的时候,可以进行屏幕亮度的调节,在调节的同时,有实时的调节进度条显示 步骤: 界面逻辑:使用Stack() 组件,完成音量图标和进度条的组合显示&#xff0c…

Linux echo,printf 命令

参考资料 【Linux】ハイフンをいっぱい出したかっただけなのに【printfコマンド】 目录 一. echo命令1.1 -n 选项1.2 -e 选项1.3 配合扩展实现批量换行输出1.3.1 xargs -n 11.3.2 tr \n1.3.3 xargs printf "%s\n"1.4 ANSI转义序列1.5 彩色文本输出 二. printf 命令…

C# System.BadImageFormatException问题及解决

C# System.BadImageFormatException问题 出现System.BadImageFormatException 异常有两种情况:程序目标平台不一致&引用dll文件的系统平台不一致。 异常参考 BadImageFormatException 程序目标平台不一致: 项目>属性>生成:x86 …

【吊打面试官系列-Redis面试题】使用过 Redis 做异步队列么,你是怎么用的?

大家好,我是锋哥。今天分享关于【使用过 Redis 做异步队列么,你是怎么用的?】面试题,希望对大家有帮助; 使用过 Redis 做异步队列么,你是怎么用的? 一般使用 list 结构作为队列,rpus…

【Redis】redis5种数据类型(list)

目录 基本介绍 命令 LPUSH LPUSHX RPUSH RPUSHX LRANGE LPOP RPOP LINDEX LINSERT LLEN LREM LTRIM LSET 阻塞版本的命令 BLPOP 内部编码 基本介绍 list相当于c的双端队列deque 区分获取和删除的区别 lindex能获取到元素的值lrem也能返回被删除元素的值 命…

828华为云征文 | 华为云FlexusX实例下的Kafka集群部署实践与性能优化

前言 华为云FlexusX实例,以创新的柔性算力技术,为Kafka集群部署带来前所未有的性能飞跃。其灵活的CPU与内存配比,结合智能调度与加速技术,让Kafka在高并发场景下依然游刃有余。在828华为云企业上云节期间,FlexusX实例携…

手机玩机常识____展讯芯片刷机平台ResearchDownload的一些基本常识与问题解决

展讯ResearchDownload工具 展讯芯片的刷机工具--ResearchDownload下载工具"是一款专为用户设计的高效、便捷的下载管理软件,它能够帮助用户快速、稳定地从互联网上获取各种文件。这款工具以其强大的功能和良好的用户体验,在众多展讯芯片下载工具中脱…

git-describe获取不到新创建的标签

一、问题描述 1、新建的分支 2、git-describe 失败 二、查询资料 (1)git-describe - 根据可用的ref给对象一个人类可读的名称 (2)该命令查找可从提交访问的最新标记。如果标记指向提交,则仅显示标记。否则&#xf…

S-Procedure的基本形式及使用

理论 Lemma 1. ( S- Procedure[ 34] ) : Define the quadratic func- \textbf{Lemma 1. ( S- Procedure[ 34] ) : Define the quadratic func- } Lemma 1. ( S- Procedure[ 34] ) : Define the quadratic func- tions w.r.t. x ∈ C M 1 \mathbf{x}\in\mathbb{C}^M\times1 x…

el-input设置type=‘number‘和v-model.number的区别

el-input设置typenumber’与设置.number修饰符的区别 1. 设置type‘number’ 使用el-input时想收集数字类型的数据,我们首先会想到typenumber,设置完type为number时会限制我们输入的内容只能为数字,不能为字符/汉字等非数字类型的数值&…

Leetcode面试经典150题-148.排序链表

题目比较简单,使用链表的归并排序 解法都在代码里,不懂就留言或者私信 合并链表部分没怎么加注释,时间实在是不充裕,看不懂的看一下这篇专门讲解合并链表的 Leetcode面试经典150题-21.合并两个有序链表-CSDN博客 /*** Definit…

Brave编译指南2024 Windows篇:安装Visual Studio 2022(二)

1.引言 在编译Brave浏览器之前,安装和配置合适的开发工具是至关重要的一步。Visual Studio 2022是编译Brave浏览器所需的重要开发环境,它提供了一整套工具和服务,以支持多种编程语言和技术。作为一款功能强大的集成开发环境(IDE&…

【vue-media-upload】一个好用的上传图片的组件,注意事项

一、问题 media 的saved 数组中的图片使用的是location 相对路径&#xff0c;但是我的业务需要直接根据图片链接展示图片&#xff0c;而且用的也不是location 相关源代码 <div v-for"(image, index) in savedMedia" :key"index" class"mu-image-…

测试ASP.NET Core的WebApi项目调用WebService

虚拟机中部署的匿名访问的WebService&#xff0c;支持简单的加减乘除操作。本文记录在WebApi中调用该WebService的方式。   VS2022创建WebApi项目&#xff0c;然后在解决方案资源管理器的Connected Services节点点右键&#xff0c;选择管理连接的服务菜单。 点击下图圈红处…

Anolis OS 8.8 CentOS8离线安装mysql-8.0.9

下载mysql安装包&#xff1a; mysql下载地址 在Linux系统中&#xff0c;mysql的安装包除了要区分系统和cpu架构之外&#xff0c;还区分安装方式&#xff0c;下载不同的包&#xff0c;安装方式也完全不一样&#xff0c;安装完成后的效果也完全不一样。 我之前下载的包按照官方…

QT Layout布局,隐藏其中的某些部件后,不影响原来的布局

最近在工作时&#xff0c;被要求&#xff0c;需要将布局中的某些部件隐藏后&#xff0c;但不能影响原来的布局。 现在记录解决方案&#xff01; 一、水平布局&#xff08;垂直布局一样&#xff09; ui中的布局 效果&#xff1a; 按钮可以任意隐藏&#xff0c;都不影响其中布…

CCS811二氧化碳传感器详解(STM32)

目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 3.工作原理介绍 三、程序设计 main.c文件 ccs811.h文件 ccs811.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 CCS811模块是一种气体传感器&#xff0c;可以测量环境中TVOC(总挥发性有机物质)浓度和eCO2…

Redis学习——数据不一致怎么办?更新缓存失败了又怎么办?

文章目录 引言正文读写缓存的数据一致性只读缓存的数据一致性删除和修改数据不一致问题操作执行失败导致数据不一致解决办法 多线程访问导致数据不一致问题总结 总结参考信息 引言 最近面试快手的时候被问到了缓存不一致怎么解决&#xff1f;一开始还是很懵的&#xff0c;因为…

关于java同步调用多个接口并返回数据

在现代软件开发中&#xff0c;应用程序经常需要与多个远程API接口进行交互以获取数据。Java作为一种流行的编程语言&#xff0c;提供了多种方式来实现这一需求。本文将探讨如何在Java中同步调用多个API接口&#xff0c;并有效地处理和返回数据。 同步调用的必要性 在某些场景下…

音视频推流中使用wireshark进行抓包分析RTMP

一、前期工作 最近使用开发板采集音视频数据合成FLV流后进行推流到PC端&#xff08;RTMP协议&#xff09;&#xff0c;PC端需要安装对应的nginx以及支持rtmp的nginx&#xff0c;在网上找了教程后安装成功&#xff0c;现在使用wireshark工具对开发板于pc端之间的通信协议进行解析…