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 表中的外键约束:
在这里插入图片描述
在这里插入图片描述

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

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

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

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

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

相关文章

《Linux运维总结:基于ARM64+X86_64架构CPU使用docker-compose一键离线部署mongodb 7.0.14容器版副本集群》

总结:整理不易,如果对你有帮助,可否点赞关注一下? 更多详细内容请参考:《Linux运维篇:Linux系统运维指南》 一、部署背景 由于业务系统的特殊性,我们需要面向不通的客户安装我们的业务系统&…

[Visual Stuidio 2022使用技巧]2.配置及常用快捷键

使用vs2022开发WPF桌面程序时常用配置及快捷键。 语言:C# IDE:Microsoft Visual Studio Community 2022 框架:WPF,.net 8.0 一、配置 1.1 内联提示 未开启时: 开启后: 开启方法: 工具-选…

基于微信小程序的垃圾分类(lw+演示+源码+运行)

摘 要 随着生态文明体制改革的不断推进,可持续发展的环保理念逐渐成为社会共识,而在推行环保措施的过程中却困难重重.针对生活废弃物肆意无序投放的问题,尽管目前各大城市相继推出垃圾分类强制性执行的政策法规,但因市民欠缺对垃圾种类的正确认识而导致垃圾分类的施行难度和成…

Luban策划开源工具

一、Luban游戏配置解决方案,是一个强大、易用、优雅、稳定的游戏配置解决方案。它设计目标为满足从小型到超大型游戏项目的简单到复杂的游戏配置工作流需求。luban标准化了游戏配置开发工作流,可以极大提升策划和程序的工作效率。 二、核心特性&#xf…

【代码随想录训练营第42期 Day58打卡 - 图论Part8 - 拓扑排序

目录 一、拓扑排序介绍 定义 特点 实现方法(2种) 应用 二、题目与题解 题目:卡码网 117. 软件构建 题目链接 题解:拓扑排序 - Kahn算法(BFS) 三、小结 一、拓扑排序介绍 对于拓扑排序&#xff0c…

攻防世界 ics-05

ics-05 隐藏的变量传参,php弱类型比较 只有设备维护中心可以点击进去 查看源码,发现有个隐藏的超链接变量传参 看到变量传参,有可能存在文件包含漏洞读取源码,这个站是php的站,所以可以使用php伪协议读取源码 index.p…

Web 原生组件化方案:Web Components

你好,我是沐爸,欢迎点赞、收藏、评论和关注。 Web 组件化是一种将Web应用的UI部分拆分成可复用的独立组件的架构方法。这种方法有助于提高代码的可维护性、可重用性和可测试性。 而Web Components 标准则提供了一套原生的API,允许开发者创建…

IDEA 通义灵码 插件使用体验

目录 前言 主要功能 演示代码 解释代码 生成单元测试 生成代码注释 生成优化建议 代码片段补全 总结 前言 自从 AI 技术开始大规模应用,老板就想让下面的牛马借助 AI 工具来提高编码效率,由于团队都没有在实际编码中深度使用过 AI 工具&#x…

视频推拉流/直播点播EasyDSS平台安装失败并报错“install mediaserver error”是什么原因?

TSINGSEE青犀视频推拉流/直播点播EasyDSS平台支持音视频采集、视频推拉流、播放H.265编码视频、存储、分发等视频能力服务,在应用场景中可实现视频直播、点播、转码、管理、录像、检索、时移回看等。此外,平台还支持用户自行上传视频文件,也可…

【物联网技术大作业】设计一个智能家居的应用场景

前言: 本人的物联网技术的期末大作业,希望对你有帮助。 目录 大作业设计题 (1)智能家居的概述。 (2)介绍智能家居应用。要求至少5个方面的应用,包括每个应用所采用的设备,性能&am…

【深度学习】神经网络-怎么分清DNN、CNN、RNN?

怎么分清DNN、CNN、RNN? 最“大”的概念是人工神经网络(Artificial Neural Network, ANN),它是较为广泛的术语,通常指的是一类模拟生物神经网络的数学模型,其中包括神经元、权重和连接。在这个术语下&#…

【Redis】主从复制 - 源码

因为主从复制的过程很复杂, 同时核心逻辑主要集中在 replication.c 这个文件中, 避免篇幅过大, 所以将主从复制中涉及这个文件的代码集中到了另一篇文章。 在当前文章主要分析主从复制的大体代码逻辑, 如果需要了解整体的过程, 可以配合 Redis 主从复制 - relication 源码分析 …

iOS 知识点记录

王巍 博客地址:OneVs Den git地址:onevcat (Wei Wang) GitHub 江湖人称喵神,目前就职于line。喵神的博客涉及方面比较广, 有Obejctive-C, Swift, SwiftUI, Unity等等。博客内容很有深度,非常值得关注。 戴铭 博客地址&#xff1…

ESP32-WROOM-32 开篇(刚买)

简介 买了一个ESP32-WROOM-32模块的开发板, 记录板初上机细节。 模块简介 Look 连接PC 1. 解决驱动问题 https://www.silabs.com/developers/usb-to-uart-bridge-vcp-drivers?tabdownloads 下载驱动, 如下图 解压缩下载的包, 然后电机64位的版本, 一直…

汽车无钥匙启动功能工作原理

移‌动管家无钥匙启动‌是一种科技化的汽车启动方式,它允许车主在不使用传统钥匙的情况下启动车辆。这种技术通过智能感应系统实现,车主只需携带智能钥匙,当靠近车辆时,车辆能够自动解锁并准备启动。启动车辆时,车主无…

友思特方案 | 搭建红外桥梁:嵌入式视觉接口助力红外热像仪传输

导读 为红外成像设备数据传输快速搭桥!友思特嵌入式视觉接口能帮助用户快速享有 GigE Vision 协议优势,是红外成像设备视觉接口集成、开发高性能相机的高效快捷方案。 引言 红外热像仪作为一种非接触式设备,能够检测红外能量(热量…

CSS实现前端布局更巧妙的方案!在 flex 布局中通过使用 margin 实现水平垂直居中以及其他常见的前端布局

在前端开发中,实现水平垂直居中一直是个热门话题。随着 CSS Flexbox 布局的普及,开发者们开始更多地使用 justify-content 和 align-items 这两个属性来解决这个问题。 然而,还有一种更加简洁、灵活的方式——使用 margin: auto; 来实现居中以…

Grafana面板-linux主机详情(使用标签过滤主机监控)

1. 采集器添加labels标签区分业务项目 targets添加labels (模板中使用的project标签) … targets: [‘xxxx:9100’] labels: project: app2targets: [‘xxxx:9100’] labels: project: app1 … 2. grafana面板套用 21902 模板 演示

UE5 阴影通道

Shadow Pass Switch节点中 Default代表模型遮罩的效果 Shadow代表阴影的生成遮罩效果

3. 进阶指南:自定义 Prompt 提升大模型解题能力

怎么判断 Prompt 的好坏,有什么问题有着标准答案么? 答:让大模型求解数学问题。 李宏毅老师的 HW4 正好提到了有关数学问题的 Prompt,所以我决定中间插一篇这样的文章。通过本文你将: 了解各种 Prompt 如何影响大型语言…