【⑫MySQL | 约束(二)】外键 | 默认值 | 检查约束 — 综合案例

前言

✨欢迎来到小K的MySQL专栏,本节将为大家带来MySQL外键 | 默认值 | 检查约束 以及综合案例的分享

目录

  • 前言
      • 6. 外键约束(FOREIGN KEY,FK)
      • 7. 默认值约束和检查约束
      • 8. 综合实战
      • 总结


6. 外键约束(FOREIGN KEY,FK)

前面介绍的完整性约束都是在单表中进行设置,而外键约束则保证多个表(通常为两个表)之间的参照完整性,即构建于两个表的两个字段之间的参照关系。

6.1 概念

设置外键约束的两个表之间会具有父子关系,即子表中某个字段的取值范围由父表所决定。例如,表示一种部门和雇员关系,即每个部门有多个雇员。首先应该有两个表:部门表和雇员表,然后雇员表中有一个表示部门编号的字段deptno,其依赖于部门表的主键,这样字段deptno就是雇员表的外键,通过该字段部门表和雇员表建立了关系。

对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。

在具体设置FK约束时,设置FK约束的字段必须依赖于数据库中已经存在的父表的主键,同时外键可以为NULL。
在这里插入图片描述

6.2 特点

  • 从表的外键列必须引用(参考)主表的主键或唯一约束的列:因为参考的值必须是唯一的
  • 在创建外键约束时,如果不给外键约束命名,默认名不是列名,而是自动产生一个外键名,如emp11_ibfk_1,也可以指定外键约束名
  • 创建表时必须先创建主表,再创建从表
  • 删除表是必须先删除从表(或先删除外键约束),再删除主表
  • 当主表的记录被从表参照时,主表的记录将不允许删除,如果要删除数据,需要先删除从表中依赖该字段的记录,然后才可以删除主表中的记录
  • 当创建外键约束时,系统默认会在所在的列上建立对应的普通索引;删除外键约束之后,必须手动删除对应的索引

6.3 添加外键约束

设置表中某字段的FK 约束非常简单,其语法形式如下:

CREATE TABLE table_name(字段名 数据类型,字段名 数据类型,...CONSTRAINT 外键约束名 FOREIGN KEY (字段名1)REFERENCES 主表名 (字段名2)
);

在上述语句中,“外键约束名”用来标识约束名,“字段名1”是子表中设置外键的字段名,“字段2”是子表参照的父表中字段名。

(1)建表时添加

CREATE TABLE 主表名
(字段名 数据类型 PRIMARY KEY,字段名 数据类型,...
);CREATE TABLE 从表名
(字段名 数据类型 PRIMARY KEY,字段名 数据类型,...CONSTRAINT 约束名 FOREIGN KEY(外键约束字段名)REFERENCES 主表(参考字段名)
);

(1)建表后添加

一般情况下,表与表的关联都是提前设计好的,因此,会在创建表的时候就把外键约束定义好。不过,如果需要修改表的设计(比如添加新的字段,增加新的关联关系),但是没有预先定义外键约束,那么,就要用修改表的方式来补充定义。

格式:

ALTER TABLE 从表名 ADD [CONSTRAINT 约束名] FOREIGN KEY(从表字段名) REFERENCES 主表名(被参考字段) [ON UPDATE XX][ON DELETE XX];

范例:

ALTER TABLE emp ADD [CONSTRAINT fk_emp_deptno] FOREIGN KEY(deptno) REFERENCES dept(deptno);

6.4 演示

6.4.1 创建表

#新建数据库
CREATE DATABASE db_maye;
USE db_maye;#创建表
CREATE TABLE dept
(deptno INT PRIMARY KEY COMMENT '部门编号',dname VARCHAR(20) NOT NULL  COMMENT '部门名称',loc   VARCHAR(20)  COMMENT '部门所在位置'
);CREATE TABLE emp
(empno INT PRIMARY KEY  COMMENT '员工编号',ename VARCHAR(10) NOT NULL  COMMENT '员工姓名',deptno INT  COMMENT '员工所在部门编号',	#外键必须使用表级约束CONSTRAINT fk_emp_deptno FOREIGN key(deptno) REFERENCES dept(deptno)
);
#必须先创建dept表,再创建emp表,如果没有指定外键,那么随便先创建哪个都行

6.4.2操作表

  • 添加记录
#给员工表添加一条记录
INSERT INTO emp(empno,ename,deptno) VALUES(1234,'king',10);
-- 在dept表中不存在10号部门,所以错误->error:无法添加或更新子行:外键约束失败(' db_maye ')。 外键约束:fk_emp_deptno (' deptno ')#先给dept添加记录,再执行上面的插入语句即可
INSERT INTO dept(deptno,dname,loc) VALUES(10,'C/C++','武汉');
  • 删除记录

#删除主表dept中的记录
DELETE FROM dept WHERE deptno=10;
-- 在从表emp中有部门编号为10的,所以错误->Cannot delete or update a parent row: a foreign key constraint fails...#先删除从表emp中参考指定值的记录,再执行上面的删除语句即可
DELETE FROM emp WHERE deptno=10;
  • 修改记录
#修改主表dept中的部门编号(把部门编号为10的改为20)
UPDATE dept SET deptno=20 WHERE deptno=10;
-- 在emp表中有参考dept表的deptno的外键,所以不能修改-> Cannot delete or update a parent row: a foreign key constraint fails...#可以先删除从表emp中参考指定值的记录,再执行上面的语句
DELETE FROM emp WHERE deptno=10;
  • 创建完表后添加外键约束
ALTER TABLE emp ADD [CONSTRAINT fk_emp_deptno] FOREIGN KEY(deptno) REFERENCES dept(deptno);
  • 删除约束和索引
#先查看约束名
SELECT * FROM information_schema.TABLE_CONSTRAINTS
WHERE table_name='emp';#删除外键约束
ALTER TABLE emp DROP FOREIGN KEY fk_emp_deptno;#查看指定表的索引
SHOW INDEX FROM emp;
#最后手动删除索引
ALTER TABLE emp DROP INDEX fk_emp_deptno;

6.5 开发场景

Ques 1:如果两个表之间有关系(一对一,一对多),比如员工表和部门表(一对多),他们之间是否一定要建立外键约束?

Answer:不是的,没有外键约束,照样用的好好的!!

Ques 2:建不建外键约束有什么区别?

Answer:

  • 建立外键约束,你的操作(创建表、删除表,添加、修改、删除数据)会受到限制。

    • 例如:在员工表中不可能添加一个员工信息,如果他的部门的编号在部门表找不到。
  • 不建立外键约束,你的操作(创建表、删除表,添加、修改、删除数据)不会受到限制,但也要保证数据的引用完整性,只能依靠程序员的自觉或者在访问的时候进行限定

    • 列如在员工表中,可以添加一个员工信息,即使他的部门不在部门表中

Ques 3:那么建不建外键约束和查询有没有关系?

Answer:没有

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

6.6 阿里开发规范

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

说明:部门表dept中的deptno是主键,那么员工表emp中的empno则为外键。如果更新部门表中的deptno,同时触发员工表中的deptno更新,即为级联更新。外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。

6.7 级联操作

当我们需要删除部门表(主表)信息时,必须先删除员工表(从表)中关联的数据,很麻烦!!!

这时候我们就可以用到级联操作:级联操作指的就是,当你操作主表时,自动的操作从表

两种级联操作

  • 级联删除:当删除主表数据是时自动删除从表中相关数据
  • 级联更新:当主表外键约束字段(一般是主键)更新时,自动更新从表的数据

五种级联方式

定义从表的外键时指定的ON UPDATE/ON DELETE子句, InnoDB支持5种方式,分列如下 :

  • CASCADE 级联方式

    • 在主表上update/delete记录时,同步update/delete掉从表的匹配记录
  • SET NULL 设置为NULL

    • 在主表上update/delete记录时,将从表上匹配记录的列为NULL
  • NO ACTION 不允许更新和删除

    • 如果从表中有匹配的记录,则不允许对主表的关联字段更新
  • RESTRICT 限制

    • 同NO ACTION
  • SET DEFAULT

    • 主表有变更时,子表将外键列设置成一个默认的值,但Innodb不能识别…

范例:可以看到下图中从表的数据随着主表数据的修改变化了且主表被限制不能删除数据

CREATE TABLE emp1
(empno INT PRIMARY KEY  COMMENT '员工编号',ename VARCHAR(10) NOT NULL  COMMENT '员工姓名',deptno INT  COMMENT '员工所在部门编号',	#外键必须使用表级约束CONSTRAINT fk_emp_deptno FOREIGN KEY(deptno) REFERENCES dept(deptno)ON UPDATE CASCADE ON DELETE RESTRICT
);INSERT INTO emp1(empno,ename,deptno) VALUES(1234,'king',20);
INSERT INTO emp1(empno,ename,deptno) VALUES(234,'ing',20);
INSERT INTO emp1(empno,ename,deptno) VALUES(34,'ng',20);UPDATE dept SET deptno=30 WHERE deptno=20;DELETE FROM dept WHERE deptno=30;

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

7. 默认值约束和检查约束

7.1 检查约束(Check)

检查某个字段的值是否符合xx要求,一般指的是值的范围

MySQL5.7可以使用check约束,但check约束不生效~

MySQL8.0开始使用check约束,就生效了,可以正确进行检查

  • 创建表时添加检查约束,可以直接添加,也可以在后面添加(起别名的方式),删除比较方便
#1
CREATE TABLE stu
(id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(10),gender CHAR CHECK(gender IN('男','女'))
);#2
CREATE TABLE stu
(id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(10),gender CHAR CHECK(gender IN('男','女')),age TINYINT,sal DECIMAL(10,2),CONSTRAINT ck_stu_sal CHECK(sal>200),CONSTRAINT ck_stu_age CHECK(age BETWEEN 18 AND 120)
);
  • 再举例
age TINYINT check(age>20) 
或
age TINYINT check(age BETWEEN 18 AND 120) 
  • 创建表后添加检查约束
ALTER TABLE stu ADD CONSTRAINT ck_stu_sal CHECK(sal>2000);

删除检查约束

ALTER TABLE stu DROP CHECK ck_stu_sal;

在这里插入图片描述

7.2 默认值约束(Default)

当为数据库表中插入一条新记录时,如果没有为某个字段赋值,那么数据库系统会自动为这个字段插入默认值。为了达到这种效果,可以通过SQL语句关键字DEFAULT来设置。

设置数据库表中某字段的默认值非常简单,其语法形式如下:

  • 创建表时添加
CREATE TABLE df
(id INT PRIMARY KEY,name VARCHAR(10) DEFAULT 'maye'
);
  • 创建表后添加
ALTER TABLE df MODIFY name VARCHAR(10) DEFAULT 'hello';
  • 删除默认约束
ALTER TABLE df MODIFY name VARCHAR(10);

在这里插入图片描述

8. 综合实战

8.1 建立数据表

8.1.1 表字段描述

到了秋天,为了让同学们增加体育锻炼,所以学校开始筹备学生运动会的活动,为了方便保存比赛成绩信息,所以定义了如下的几张数据表。

  • 运动员表(sporter):
    • 运动员编号sporterno、运动员姓名name、运动员性别gender、所属系号deptno
  • 体育项目表(item):
    • 项目编号itemno、项目名称iname、比赛地点loc
  • 成绩表(grade):
    • 运动员编号sporterno、项目编号itemno、得分mark

在这里插入图片描述

在成绩表之中包含了两个外键:分别是运动员的编号、项目的编号,之所以这样设计,是因为一个运动员可以参加多个项目,一个项目可以有多个运动员参加,每个运动员针对不同的项目有自己的成绩。所以运动员和项目之间是属于多对多关系。而之前所学的emp-dept是属于一对多的关系。

8.1.2 表中的约束

在这里插入图片描述

8.1.3 SQL语句

# 创建数据库
CREATE DATABASE IF NOT EXISTS games1;
USE games1;CREATE TABLE IF NOT EXISTS spoter
(spoterno INT,name     VARCHAR(30) NOT NULL,gender   CHAR        NOT NULL,deptname VARCHAR(30) NOT NULL,CONSTRAINT pk_spoterno PRIMARY key(spoterno),CONSTRAINT ck_gender   check(gender IN('男','女'))
)COMMENT '运动员表';CREATE TABLE IF NOT EXISTS item
(itemno   INT,itemname VARCHAR(30) NOT NULL,loc      VARCHAR(30) NOT NULL,CONSTRAINT pk_itemno PRIMARY key(itemno)
)COMMENT '项目表';CREATE TABLE IF NOT EXISTS grade
(spoterno INT,itemno INT,mark INT,CONSTRAINT ck_mark CHECK(mark IN(0,2,4,6)),CONSTRAINT fk_spoterno FOREIGN key(spoterno) REFERENCES spoter(spoterno),CONSTRAINT fk_itemno FOREIGN key(itemno) REFERENCES item(itemno)
)COMMENT '成绩表';--  添加测试数据
INSERT INTO spoter(spoterno,name,gender,deptname) VALUES(1001,'rust','男','计算机系');
INSERT INTO spoter(spoterno,name,gender,deptname) VALUES(1002,'go','男','数学系');
INSERT INTO spoter(spoterno,name,gender,deptname) VALUES(1003,'python','男','计算机系');
INSERT INTO spoter(spoterno,name,gender,deptname) VALUES(1004,'c++','男','物理系');
INSERT INTO spoter(spoterno,name,gender,deptname) VALUES(1005,'c','女','心理系');
INSERT INTO spoter(spoterno,name,gender,deptname) VALUES(1006,'java','女','数学系');INSERT INTO item(itemno,itemname,loc) VALUES(1,'男子五千米','一操场');
INSERT INTO item(itemno,itemname,loc) VALUES(2,'男子标枪','一操场');
INSERT INTO item(itemno,itemname,loc) VALUES(3,'男子跳远','二操场');
INSERT INTO item(itemno,itemname,loc) VALUES(4,'女子跳高','二操场');
INSERT INTO item(itemno,itemname,loc) VALUES(5,'女子三千米','三操场');INSERT INTO grade(spoterno,itemno,mark) VALUES(1001,1,6);
INSERT INTO grade(spoterno,itemno,mark) VALUES(1002,1,4);
INSERT INTO grade(spoterno,itemno,mark) VALUES(1003,1,2);
INSERT INTO grade(spoterno,itemno,mark) VALUES(1004,1,0);
INSERT INTO grade(spoterno,itemno,mark) VALUES(1001,3,4);
INSERT INTO grade(spoterno,itemno,mark) VALUES(1002,3,6);
INSERT INTO grade(spoterno,itemno,mark) VALUES(1004,3,2);
INSERT INTO grade(spoterno,itemno,mark) VALUES(1003,3,0);
INSERT INTO grade(spoterno,itemno,mark) VALUES(1005,4,6);
INSERT INTO grade(spoterno,itemno,mark) VALUES(1006,4,4);
INSERT INTO grade(spoterno,itemno,mark) VALUES(1001,4,2);
INSERT INTO grade(spoterno,itemno,mark) VALUES(1002,4,0);
INSERT INTO grade(spoterno,itemno,mark) VALUES(1003,2,6);
INSERT INTO grade(spoterno,itemno,mark) VALUES(1005,2,4);
INSERT INTO grade(spoterno,itemno,mark) VALUES(1006,2,2);
INSERT INTO grade(spoterno,itemno,mark) VALUES(1001,2,0);SELECT * FROM spoter;
SELECT * FROM item;
SELECT * FROM grade;

8.2 数据操作

第一题:求出目前总积分最高的系名及其积分。

  1. 确定所需要的数据表
    1. spoeter:系名
    2. grade:积分
  2. 确定已知关联字段
    1. 远动员和积分:sporter.sporterno=grade.sporterno
WITH temp AS
(	SELECT s.deptname deptname,SUM(g.mark) totalmarkFROM spoter s,grade gWHERE s.spoterno=g.spoternoGROUP BY deptname
)
SELECT deptname,totalmark FROM temp
HAVING totalmark=(SELECT MAX(totalmark) FROM temp);

第二题:找出在一操场进行比赛的各项目名称极其冠军的姓名。

  1. 确定所需数据表
    #sporter:冠军的姓名
    #item:一操场比赛的运动员
    #grade:求出冠军
  2. 确定关联字段
    #运动员和积分:sporter.sporterno=grade.sporterno
    #项目和积分:item.itemno = grade.itemno
WITH temp AS
(	SELECT i.itemno,MAX(g.mark) maxmarkFROM item i,grade gWHERE i.itemno=g.itemno AND i.loc='一操场'GROUP BY i.itemno
)
SELECT * 
FROM temp t,spoter s,item i,grade g
WHERE g.mark=t.maxmark AND s.spoterno=g.spoterno 
AND i.itemno=g.itemno AND t.itemno=g.itemno;

第三题:找出参加了c++所参加过的项目的其他同学的姓名。
确定所需数据表sporter:c++grade:c++参加过的项目

WITH temp AS
(SELECT g.itemnoFROM spoter s,grade gWHERE s.spoterno=g.spoternoAND s.name='c++'
)
SELECT DISTINCT s.name
FROM spoter s,grade g
WHERE s.spoterno=g.spoterno 
AND g.itemno IN(SELECT * FROM temp)
AND s.name!='c++';

第四题:经查c++因为使用了违禁药品,其成绩都记为0分,请在数据库中做出相应的修改。

UPDATE grade SET mark=0 WHERE spoterno=
(SELECT spoterno FROM spoter WHERE name='c++');

第五题:经组委会协商,需要删除女子跳高比赛项目。先删除grade中的外键

ALTER TABLE grade DROP FOREIGN KEY fk_itemno;
DELETE FROM item WHERE itemname='女子跳高';

总结

总的来说,使用约束可以提高数据库的数据质量、一致性和完整性,简化数据操作,并提高数据库的性能。它是数据库设计和管理中的重要概念,有助于保证数据的可靠性和有效性~下节为大家打来数据类型的分享

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

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

相关文章

七夕前的爱心代码!

话不多说上代码! import turtle as tu import random as ratu.setup(1.0, 1.0) tu.screensize(1.0, 1.0) tu.bgcolor(black) t tu.Pen() t.ht() colors [pink, hotpink, deeppink, lightpink, red, purple, violet, magenta]def draw_star(x, y, size, color):t.…

HASH索引,AVL树,B树,B+树的区别?

提前声明,本篇文章是我对我之前B树那篇文章的追加部分和补充的知识点,建议各位在看本篇文章的时候时已经了解了数据库索引B树的基本原理,否则有些地方可能理解起来会多一些难度哦! 深入理解索引B树的基本原理_程序猿ZhangSir的博…

iOS17 widget Content margin

iOS17小组件有4个新的地方可以放置分别是:Mac桌面、iPad锁屏界面、 iPhone Standby模式、watch的smart stack Transition to content margins iOS17中苹果为widget新增了Content margin, 使widget的内容能够距离边缘有一定的间隙,确保内容显示完整。这…

Datawhale Django入门组队学习Task02

Task02 首先启动虚拟环境(复习一下之前的) 先退出conda的, conda deactivate然后cd到我的venv下面 ,然后cd 到 scripts,再 activate (powershell里面) 创建admin管理员 首先cd到项目路径下&a…

线性代数的学习和整理6:向量和矩阵详细,什么是矩阵?(草稿-----未完成)

43 矩阵 4.1 矩阵 4 整理网上总结一些 关于直击线性代数本质的 观点 矩阵的本质是旋转和缩放 矩阵里的数字0矩阵里的数字1,表示不进行缩放矩阵里的数字2等,表示缩放矩阵里的数字-3 表示缩放-3倍,并且反向矩阵里的数字的位置矩阵拆分为列向量…

【C#学习笔记】C#特性的继承,封装,多态

文章目录 封装访问修饰符静态类和静态方法静态构造函数 继承继承原则sealed修饰符里氏替换原则继承中的构造函数 多态接口接口的实例化 抽象类和抽象方法抽象类和接口的异同 虚方法同名方法new覆盖的父类方法继承的同名方法 运行时的多态性编译时的多态性 照理继承封装多态应该…

基于 Vercel TiDB Serverless 的 chatbot

作者: shiyuhang0 原文来源: https://tidb.net/blog/7b5fcdc9 # 前言 TiDB Serverless 去年就有和 Vercel 的集成了,同时还有一个 bookstore template 方便大家体验。但个人感觉 bookstore 不够炫酷,借 2023 TiDB hackthon 的…

c#设计模式-结构型模式 之 代理模式

前言 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接 引用目标对象,代理对象作为访问对象和目标对象之间的中介。在学习代理模式的时候,可以去了解一下Aop切面编程AOP切面编程_aop编程…

使用预制体画刷在游戏场景中快速布置预制体、粒子特效等

有时候在使用tilemap的时候,会希望在场景中添加更复杂的对象。 在2d-extras中,加入了预制件笔刷(Prefab Brush),可以将游戏物体预制体作为瓦片,来方便的在游戏场景中快速的绘制。可以自动适应游戏物体的位置…

Python Django 模型概述与应用

今天来为大家介绍 Django 框架的模型部分,模型是真实数据的简单明确的描述,它包含了储存的数据所必要的字段和行为,Django 遵循 DRY Principle 。它的目标是你只需要定义数据模型,然后其它的杂七杂八代码你都不用关心,…

总结 TCP 协议的相关特性

TCP协议段格式: 如图, 端口号: 是其中一个重要的部分,知道端口号才能确认数据交给哪个应用程序(端口号属于传输层的概念). 4位首部长度:4bit表示的范围是0->15,在此处,单位是"4字节",因此,将这里的数值 * 4,才是真正的报头长度,即TCP 报头最大长度,60…

基于Python的高校毕业生离校系统SpringBoot+Vue【源码+lw】

💕💕作者:计算机源码社 💕💕个人简介:本人七年开发经验,擅长Java、微信小程序、Python、Android、大数据等,大家有这一块的问题可以一起交流! 💕&#x1f495…

Spring Security OAuth2.0认证授权

(单体项目的认证,微服务项目的认证授权) 1.基本概念 1.1 什么是认证 进入移动互联网时代,大家每天都在刷手机,常用的软件有微信、支付宝、头条等,下边拿微信来举例子说明认证相关的基本概念,在…

【bug】Unity无法创建项目

bug UnityHub无法创建项目 UnityHub无法创建项目 出现的问题:在创建新项目时弹出来一个 无法创建项目 尝试的方法: 刷新许可证 ❌没用退出账号重新登陆 ❌没用重启电脑 ❌没用 最后发现是什么问题呢? 2021.3.3这个版本我之前在资源管理器中…

C++------利用C++实现二叉搜索树【数据结构】

文章目录 二叉搜索树概念二叉搜索树的操作查找插入删除 二叉搜索树的应用 二叉搜索树 概念 什么是二叉搜索树,二叉搜索树就是指左孩子永远比根小右孩子永远比根大。这个规则适用于所有的子树。 上面的就是一棵二叉搜索树,我们还可以发现这棵树走一个中…

大语言模型与语义搜索;钉钉个人版启动内测,提供多项AI服务

🦉 AI新闻 🚀 钉钉个人版启动内测,提供多项AI服务 摘要:钉钉个人版正式开始内测,面向小团队、个人用户、高校大学生等人群。该版本具有AI为核心的功能,包括文生文AI、文生图AI和角色化对话等。用户可通过…

LeetCode 2236. 判断根结点是否等于子结点之和

【LetMeFly】2236.判断根结点是否等于子结点之和 力扣题目链接:https://leetcode.cn/problems/root-equals-sum-of-children/ 给你一个 二叉树 的根结点 root,该二叉树由恰好 3 个结点组成:根结点、左子结点和右子结点。 如果根结点值等于…

学习网络编程No.3【socket理论实战】

引言: 北京时间:2023/8/12/15:32,自前天晚上更新完文章,看了一下鹅厂新出的《扫毒3》摆烂至现在,不知道是长大了,还是近年港片就那样,给我的感觉不是很好,也可能是国内市场对港片不…

通过微软Azure调用GPT的接口API-兼容平替OpenAI官方的注意事项

众所周知,我们是访问不通OpenAI官方服务的,但是我们可以自己通过代理或者使用第三方代理访问接口 现在新出台的规定禁止使用境外的AI大模型接口对境内客户使用,所以我们需要使用国内的大模型接口 国内的效果真的很差,现在如果想使…

计算机视觉掩模区域与二值图像

掩模区域 在图像处理中,我们经常需要对图像中的某些特定区域进行操作,例如对某个区域进行滤波、变换、裁剪或者其他处理。为了实现这些操作,我们需要明确指定这些区域,这就是掩模区域的作用。 掩模区域通常由一个二值图像表示&…