当前位置: 首页 > news >正文

【PostgreSQL】在DBeaver中实现序列、函数、视图、触发器设计

【PostgreSQL】在DBeaver中实现序列、函数、触发器、视图设计

  • 基本配置
  • 一、序列
    • 1.1、序列使用
      • 1.1.1、设置字段为主键,数据类型默认整型
      • 1.1.2、自定义序列,数据类型自定义
    • 1.2、序列延申
      • 1.2.1、理论
      • 1.2.2、测试
      • 1.2.3、小结
  • 二、函数
    • 2.1、SQL直接创建
      • 2.1.1、理论
      • 2.1.2、测试
    • 2.2、借用DBeaver创建
  • 三、视图
    • 3.1、SQL语句
    • 3.2、示例
  • 四、触发器
    • 4.1、SQL语句
      • 4.1.1、触发器函数
      • 4.1.2、函数与表关联
    • 4.2、示例

基本配置

数据库管理工具:DBeaver23.2.3
PostgreSQL 14.6
测试数据库在博文中已经资源绑定分享

一、序列

1.1、序列使用

在MySQL数据库中,实现主键自增,只需要设置字段为主键即可,但在Pg数据库中却有所不同。
实现的途径主要有2种:

1.1.1、设置字段为主键,数据类型默认整型

此时字段默认为serial4,即自增 4 字节整数,范围1 到 2147483647。以表employees_history为例,主键字段id默认值为nextval(‘employees_history_id_seq’::regclass),同时会自动添加序列employees_history_id_seq
函数 nextval(regclass) 返回类型bigint,描述如下:

递增序列对象到它的下一个数值并且返回该值。这个动作是自动完成的。即使多个会话并发运行nextval,每个进程也会安全地收到一个唯一的序列值。

1.1.2、自定义序列,数据类型自定义

当主键数据类型不是整型时,使用序列自增主要采用该种方法。
首先,用SQL语句创建testseq_d_seq序列:

CREATE SEQUENCE public.testseq_d_seqINCREMENT BY 1MINVALUE 1MAXVALUE 2147483647START 1CACHE 1NO CYCLE;

为方便起见,也可在DBeaver数据库的序列中右键新建序列,在完成序列命名后,完成序列的创建。
在这里插入图片描述

其次,根据需要将主键字段设置成所需数据类型,并与创建的序列绑定,设置默认值。

nextval('testseq_d_seq'::regclass)

在这里插入图片描述

1.2、序列延申

在内容的存储过程,有时候会遇到预处理数据后再存储的情况,本节以实现‘A-%’格式存储为例,即所有存储的主键字段必须以A-开头,展开介绍。

1.2.1、理论

在展开介绍前,首先查看了一些资料,以PostgreSQL 字符串函数汇总为主,该大神的博文中清晰的罗列了基本的字符串函数,因此本文就不再进行重复论述。根据需求,我们从中选取合适的函数开展数据预处理,设置主键默认值如下:

('A-'::text || nextval('testseq_d_seq'::regclass))

在这里插入图片描述

1.2.2、测试

通过输入SQL插入记录进行测试,最终输出的记录主键字段为‘A-2’,实现需求。

INSERT INTO public.testseq
(employee_id, first_name, last_name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id)
VALUES(3091122, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL)

在这里插入图片描述

1.2.3、小结

在本小节中,我们以一个简单的示例介绍了数据库的数据预处理存储,后续大家也可以根据需要在数据库中自定义的使用函数进行需求实现,提高开发效率。当然,由于提供函数有限,针对较为复杂的预处理,依旧还是采用后端处理后再存储到数据库中。

二、函数

在PostgreSQL 数据库中自定义一些函数,可以有效帮助我们提高开发效率。本章主要介绍函数创建的2种方式:

2.1、SQL直接创建

2.1.1、理论

采用SQL创建属于万能的方式,基本的语句结构如下:

CREATE FUNCTION function_name(parameter1 datatype1, parameter2 datatype2, OUT output_parameter datatype)
RETURNS return_type AS $$
-- 函数体
$$ LANGUAGE language_name;
  • function_name函数名
  • parameter传参
  • datatype参数类型
  • output_parameter输出参数
  • return_type函数返回类型
  • language_name编程语言

为方便函数内容的更新,同时也避免由于相同函数命名存在导致执行报错的发生,增加OR REPLACE优化后的语句结构如下:

CREATE OR REPLACE FUNCTION function_name(parameter1 datatype1, parameter2 datatype2, OUT output_parameter datatype)
RETURNS return_type AS $$
-- 函数体
$$ LANGUAGE language_name;

2.1.2、测试

用SQL创建函数,需求如下:

  1. 可传不定长字符串、整型;
  2. 可更新时间;
  3. 可选传参数。

编写的SQL语句如下所示,其中character varying为不定长字符串数据类型:

CREATE OR REPLACE FUNCTION public.test_han(_employee_id integer, _last_name character varying, _salary integer DEFAULT 10,  _job_id character varying DEFAULT NULL, OUT _id character varying)RETURNS character varying AS $$BEGININSERT INTO testseq  (employee_id,last_name,hire_date,job_id,salary)VALUES(_employee_id,_last_name,now( ),_job_id,_salary) RETURNING id INTO _id;
END;
$$ LANGUAGE plpgsql

在DBeaver运行后,最终函数显示的源如下所示:

CREATE OR REPLACE FUNCTION public.test_han(_employee_id integer, _last_name character varying, _salary integer DEFAULT 10, _job_id character varying DEFAULT NULL::character varying, OUT _id character varying)RETURNS character varyingLANGUAGE plpgsql
AS $function$BEGININSERT INTO testseq  (employee_id,last_name,hire_date,job_id,salary)VALUES(_employee_id,_last_name,now( ),_job_id,_salary) RETURNING id INTO _id;
END;
$function$
;

两个SQL语句都可以正常运行。用语句select test_han(12,'test')进行函数调用,最终完成记录的插入,同时返回参数如下:
在这里插入图片描述

2.2、借用DBeaver创建

该方法本质依旧是执行SQL语句,只不过不需要进行函数创建的SQL语句编写,更关注于函数体的业务需求实现。

首先,将DBeaver切到public-存储过程,然后右键 新建 存储过程 ,填写函数名称、语言类型、返回参数类型,完成函数架构的搭建。
在这里插入图片描述
然后,在架构中编写函数体与传参。最后,快捷键Ctrl+S保存,点击执行,完成函数创建。
在这里插入图片描述

三、视图

视图是一张假表,只不过是通过相关的名称存储在数据库中的一个 PostgreSQL语句。而且视图是只读的,因此可能无法在视图上执行DELETE、INSERT 或UPDATE语句。但是可以在视图上创建一个触发器,当尝试 DELETE、INSERT 或 UPDATE 视图时触发,需要做的动作在触发器内容中定义。

3.1、SQL语句

创建视图的SQL语句结构如下所示,注意以 结尾:

CREATE VIEW view_name AS 
--SELECT语句
  • view_name视图名

同样的,为了方便更新视图,避免出现存在同命名导致SQL执行失败情况的出现,采用OR REPLACE优化SQL语句,优化后的结构如下:

CREATE OR REPLACE VIEW view_name AS 
--SELECT语句

3.2、示例

获取表employees中数据创建视图,SQL语句如下:

CREATE OR REPLACE VIEW asd as select * from  employees e 

四、触发器

PostgreSQL支持两种级别的触发方式:行级(row-level)触发器和 语句级(statement-level)触发器,区别在于触发的时机和触发次数。例如,对于一个影响 20 行数据的 UPDATE 语句,行级触发器将会触发器 20 次,而语句级触发器只会触发 1 次。

4.1、SQL语句

创建触发器一共2步,首先用CREATE [OR REPLACE] FUNCTION创建触发器函数,其次用create trigger将触发器函数与表关联起来,从而完成创建。

4.1.1、触发器函数

基本的触发器函数SQL结构如下所示:

CREATE [ OR REPLACE ] FUNCTION trigger_function()
RETURNS trigger AS $$
-- 函数体
$$ LANGUAGE language_name;

触发器函数与普通函数创建类似,区别在于触发器函数没有传参,而且返回类型是trigger 。同时,在触发器函数的内部,系统自动封装了许多特殊的变量,这个在大神postgresql-触发器的博文中有清晰的罗列,这边就不进行重复的讲述,主要记录一些常用的:

  • NEW ,类型为 RECORD,代表了行级触发器 INSERT、UPDATE 操作之后的新数据行。对于 DELETE 操作或者语句级触发器而言,该变量为 null。
  • OLD,类型为 RECORD,代表了行级触发器 UPDATE、DELETE 操作之前的旧数据行。对于 INSERT 操作或者语句级触发器而言,该变量为 null。
  • TG_OP,触发的操作,INSERT、UPDATE、DELETE 或者 TRUNCATE。

4.1.2、函数与表关联

基本的关联SQL语句结构如下:

-- 使用 CREATE TRIGGER 语句创建一个触发器,语法如下:
CREATE TRIGGER trigger_name
{BEFORE | AFTER | INSTEAD OF} {event [OR ...]}ON table_name[FOR [EACH] {ROW | STATEMENT}][WHEN ( condition ) ]EXECUTE FUNCTION trigger_function;
  • event 可以是在所提到的表table_name上的INSERT、UPDATE、DELETE、TRUNCATE操作,而且UPDATE 支持在表的一个或多个指定列上操作(UPDATE OF col1, clo2)。
  • 触发器可以在事件之前(BEFORE)或者之后(AFTER)
    触发,INSTEAD OF 只能用于替代视图上的 INSERT、UPDATE 或者 DELETE 操作。
  • FOR EACH ROW 表示行级触发器,FOR EACH STATEMENT 表示语句级触发器。
  • WHEN 用于指定一个额外的触发条件,满足条件才会真正支持触发器函数。

DROP 可以删除整个表,包括表结构和数据,速度最快;
TRUNCATE 可以快速地删除表中的所有数据,但不删除表结构,速度中等;
DELETE 可以删除表中的数据,不包括表结构,速度最慢。

4.2、示例

需求:实现当对表employees进行insertdeleteupdate时,进行历史记录保存,保存到employees_history

首先,创建触发器函数,SQL语句如下:

CREATE OR REPLACE FUNCTION public.track_emp_change()RETURNS triggerLANGUAGE plpgsql
AS $function$
begin -- tg_op 触发的操作 if tg_op = 'INSERT' theninsert into public.employees_history(employee_id, action_type, change_dt)values(new.employee_id,'INSERT',now());elsif tg_op = 'UPDATE' theninsert into public.employees_history(employee_id, action_type, change_dt)values(old.employee_id, 'UPDATE',now());elsif tg_op = 'DELETE' theninsert into public.employees_history(employee_id, action_type, change_dt)values(old.employee_id,'DELETE',now());end if;return new;
end ;
$function$
;

其次,创建表与函数的关联,SQL语句如下:

create trigger trg_employees_change before
insertor
deleteor
updateonpublic.employees for each row execute function track_emp_change()

最终,通过INSERT INTO public.employees(id, department_id, "time")VALUES(2390, 601, now())进行调用测试,完成需求实现。

相关文章:

【PostgreSQL】在DBeaver中实现序列、函数、视图、触发器设计

【PostgreSQL】在DBeaver中实现序列、函数、触发器、视图设计 基本配置一、序列1.1、序列使用1.1.1、设置字段为主键,数据类型默认整型1.1.2、自定义序列,数据类型自定义 1.2、序列延申1.2.1、理论1.2.2、测试1.2.3、小结 二、函数2.1、SQL直接创建2.1.1…...

PyQt5-小总结

之前学习PyQt5,然后那段时间想做一个桌面小程序,后来由于学习内容较多就做了一小部分,但是可以进行页面跳转。大家如果是初学者对Python感兴趣而且刚学数据库时可以看看代码,可能会有点启发。 效果: 登录进来是这&…...

vue父组件给子组件传值,子组件不渲染的原因及解决方法

父组件传递给子组件的数据,如果是一个复杂对象(例如一个数组或对象),那么子组件只会监听对象的引用而不是对象的内容。这意味着当对象的内容发生变化时,子组件不会更新。 解决: 1、在子组件使用 watch 监听…...

【数据库】MySQL锁

一、锁的基本概念 1、锁的定义 锁是协调多个进程或线程并发访问数据库资源的一种机制。 MySQL中的锁是在服务器层或者存储引擎层实现的,保证了数据访问的一致性与有效性。但加锁是消耗资源的,锁的各种操作,包括获得锁、检测锁是否已解除、…...

mongodb学习篇

目录 前言基本概念数据库-database集合-collection文档-document 部署mongodblinux安装mongodbdocker安装mongodb MongoDB Shell (mongosh)命令行工具mongodb可视化-mongodb-compass、mongo-expressmongodb配置文件mongodb库、集合、文档库基本操作集合基本操作文档的增删改查C…...

kubernetes存储类迁移-备份恢复

背景介绍 kubernetes集群最开始使用了nfs作为存储,随着后续使用过程中数据量逐渐增加,nfs存储性能逐步出现不足,现增加了基于csi的分布式块存储后,需要对原有基于nfs存储类下的pv迁移到新的存储类下。 测试环境 k8s集群版本&am…...

python智能手机芯片

在未来,python智能手机芯片的发展方向可能包括以下几个方面: 强化处理能力:随着智能手机功能的不断扩展和用户需求的增加,处理器的性能需求也在不断提升。未来的python智能手机芯片可能会加强处理器的核心数量和频率,以…...

混淆技术概论

混淆技术概论 引言 在逆向工程领域,混淆技术是一种非常重要的技术手段,通过打破人们的思维惯性,使得逆向分析变得更加困难。本文将会介绍混淆技术的概念、分类及其应用,以及如何使用IPA Guard进行iOS IPA重签名。 混淆技术概述…...

pytest安装失败,报错Could not find a version that satisfies the requirement pytest

问题 安装pytest失败,尝试使用的命令有 pip install pytest pip3 install pytest pip install -U pytest pip install pytest -i https://pypi.tuna.tsinghua.edu.cn/simple但是都会报同样的错: 解决方案 发现可能是挂了梯子的原因,关掉…...

使用 Maven 的 dependencyManagement 管理项目依赖项

使用 Maven 的 dependencyManagement 管理项目依赖项 介绍 在开发 Java 项目时&#xff0c;管理和协调依赖项的版本号是一项重要而繁琐的任务。 而 Maven 提供了 <dependencyManagement> 元素&#xff0c;用于定义项目中所有依赖项的版本。它允许您指定项目中每个依赖…...

三英战吕布web3游戏项目启动全流程

项目是一个学习相关的很好的例子并且开源&#xff0c;原本的项目是连接goerli网络&#xff0c;但我把它修改为可连接ganache网络的项目了&#xff0c;更方便启动。 智能合约部分 进入文件 hardhat.config.js &#xff0c;增加一个钱包私钥 2.执行npm install 3.测试合约 npx ha…...

TS中的类

目录 ES6的类 类的概念 类的构成 类的创建 声明 构造函数 定义内容 创建实例 TS中的类 类声明 构造函数 属性和方法 实例化类 继承 访问修饰符 public private protected 成员访问修饰符的使用原则 访问器 只读成员与静态成员 readonly static 修饰符总…...

玩转硬件之玩改朗逸中控设备

这是一个有关一件被拆卸的朗逸中控设备的故事。这个设备已经闲置多年&#xff0c;但是它的命运发生了转变。它被改装成了一台收音机和MP3播放器。 这个设备曾经是一辆朗逸的中控屏幕&#xff0c;就是因为它没有倒车影像&#xff0c;它就被拆了下来&#xff0c;被扔在了一个角落…...

根据MySql的表名,自动生成实体类,模仿ORM框架

ORM框架可以根据数据库的表自动生成实体类&#xff0c;以及相应CRUD操作 本文是一个自动生成实体类的工具&#xff0c;用于生成Mysql表对应的实体类。 新建Winform窗体应用程序AutoGenerateForm&#xff0c;框架(.net framework 4.5)&#xff0c; 添加对System.Configuration的…...

Mac上安装tensorflow介绍留存

此预版本为 macOS 11.0 提供了硬件加速的 TensorFlow 和 TensorFlow 插件。M1 Mac 和基于 Intel 的 Mac 通过 Apple 的 ML 计算框架支持本机硬件加速。 TensorFlow r2.4rc0TensorFlow Addons 0.11.2 TensorFlow 插件 0.11.2 REQUIREMENTS 要求 macOS 11.0Python 3.8 (requir…...

【赠书第16期】码上行动:用ChatGPT学会Python编程

文章目录 前言 1 ChatGPT简介 2 Python编程简介 3 使用ChatGPT学习Python编程 4 如何使用ChatGPT学习Python编程 5 推荐图书 6 粉丝福利 前言 随着人工智能技术的不断发展&#xff0c;聊天机器人已经成为我们日常生活和工作中不可或缺的一部分。其中&#xff0c;ChatGP…...

LeetCode 每日一题 2024/1/1-2024/1/7

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 1/1 1599. 经营摩天轮的最大利润1/2 466. 统计重复个数1/3 2487. 从链表中移除节点1/4 2397. 被列覆盖的最多行数1/5 1944. 队列中可以看到的人数1/6 2807. 在链表中插入最…...

7+单细胞+空转+实验验证,如何根据内容开展相关经验给你启发

导语 今天给同学们分享一篇生信文章“CD8 tissue-resident memory T cells induce oral lichen planus erosion via cytokine network”&#xff0c;这篇文章发表在Elife期刊上&#xff0c;影响因子为7.7。 结果解读&#xff1a; 单细胞RNA测序揭示了具有不同临床亚型的OLP的细…...

Verifiable Credentials可验证证书 2023 终极指南

1. 引言 Dock公司为去中心化数字身份领域的先驱者&#xff0c;其自2017年以来&#xff0c;已知专注于构建前沿的可验证证书&#xff08;Verifiable Credentials&#xff09;技术。本文将阐述何为电子证书、电子证书工作原理、以及其对组合和个人的重要性。 伪造实物证书和数字…...

R语言【sp】——SpatialPoints():创建类SpatialPoints或SpatialPointsDataFrame的对象

Package sp version 1.5-0 Description 从坐标或数据帧的坐标创建类 SpatialPoints-class 或 SpatialPointsDataFrame-class 的对象。 Usage SpatialPoints(coords, proj4stringCRS(as.character(NA)), bbox NULL)SpatialPointsDataFrame(coords, data, coords.nrs numeric…...

【Verilog】期末复习——简要说明仿真时阻塞赋值和非阻塞赋值的区别。always语句和initial语句的关键区别是什么?能否相互嵌套?

系列文章 数值&#xff08;整数&#xff0c;实数&#xff0c;字符串&#xff09;与数据类型&#xff08;wire、reg、mem、parameter&#xff09; 运算符 数据流建模 行为级建模 结构化建模 组合电路的设计和时序电路的设计 有限状态机的定义和分类 期末复习——数字逻辑电路分…...

分享一个idea插件MyBatisX的Bug

分享一个idea插件MyBatisX的Bug The plugin com.baomidou.plugin.idea. mybatisx failed to save settings and has been disabled. Please restart IntelliJ IDEAjava.lang.Throwableat com.intellij.openapi.project.DumbServiceImpl.queueTask(DumbServiceImpl.java:293)at…...

Linux网络

一、Linux网络 查看基础的网络配置 网关、路由&#xff1a;route —n 网关、路由route —nIP地址ifconfig ip aDNS 服务器cat /etc/resolv.conf主机名hostname网络连接状态ss、netstat、syn—sent域名解析nalookup、host 1.1 ifconfig 网络接口配置 临时性修改网卡 …...

Copilot 插件的使用介绍:如何快速上手

GitHub Copilot 本文主要介绍如何通过脚本工具激活 GitHub Copilot 插件&#xff0c;提供安装及激活图文教程&#xff0c;大家按下面操作即可激活GitHub Copilot插件&#xff0c;免费使用Ai编码工具 一、GitHub Copilot 介绍 GitHub Copilot 是由 GitHub 和 OpenAI 共同开发的…...

kubesphere和k8s的使用分享

文章目录 什么是kubernetesKubernetes的部分核心概念互式可视化管理平台与kubernetes的关系市面是常见的kubernetes管理平台 什么是kubesphereKubesphere默认安装的组件Kubesphere涉及的服务组件kubesphere的安装Kubesphere相关的内容 什么是kubernetes 就在这场因“容器”而起…...

macos m1如何安装指定版本的redis

安装指定版本的Redis在macOS M1上可以通过Homebrew进行操作。Homebrew是一个在macOS上管理软件包的常用工具。 要安装特定版本的Redis&#xff0c;请首先确保已经安装了Homebrew。然后&#xff0c;可以通过以下步骤安装指定版本的Redis&#xff1a; 步骤&#xff1a; 查找可用…...

python 多线程 守护线程

daemon线程&#xff1a;守护线程&#xff0c;优先级别最低&#xff0c;一般为其它线程提供服务。通常&#xff0c;daemon线程体是一个无限循环。如果所有的非daemon线程(主线程以及子线程&#xff09;都结束了&#xff0c;daemon线程自动就会终止。t.daemon 属性&#xff0c;设…...

以unity技术开发视角对android权限的讲解

目录 前言 Android权限分类 普通权限 普通权限定义 普通权限有哪些 危险权限 危险权限的定义 危险权限有哪些 动态申请权限实例 申请单个权限实例 第一步&#xff1a;在清单文件中声明权限 第二步&#xff1a;在代码中进行动态申请权限 申请多个权限实例 第一步&am…...

910b上跑Chatglm3-6b进行流式输出【pytorch框架】

文章目录 准备阶段避坑阶段添加代码结果展示 准备阶段 配套软件包Ascend-cann-toolkit和Ascend-cann-nnae适配昇腾的Pytorch适配昇腾的Torchvision Adapter下载ChatGLM3代码下载chatglm3-6b模型&#xff0c;或在modelscope里下载 避坑阶段 每个人的服务器都不一样&#xff0…...

2024年江苏省职业院校技能大赛高职学生组软件测试—任务五接口测试题目

2024年江苏省职业院校技能大赛高职学生组软件测试任务五 接口测试 任务要求 题目1&#xff1a;登录接口脚本编写和执行测试。 1、登录接口描述如下&#xff1a; 接口功能&#xff1a;提供用户登录功能处理&#xff0c;根据传入的用户名和密码判断登录状态。 接口地址&…...

设计师的网站有哪些/seo引流什么意思

锂电池升压充电管理芯片CS5080&#xff0c;CS5086&#xff0c;CS5090&#xff0c;CS5095的功能特性与参数比较2021-07-08 23:39:120点赞0收藏0评论CS5095E是一款5V输入&#xff0c;最大1.5A充电电流&#xff0c;支持三节锂电池串联应用&#xff0c;锂离子电池的升压充电管理IC。…...

淘客类网站如何做排名/抖音引流推广一个30元

科技革新可谓一日千里&#xff0c;移动设备的智能化已经“迅雷不及下载”的速度影响着我们生活的方方面面。虽然说科技改变生活是商家叫卖的一个噱头&#xff0c;不过我们的确潜移默化的接受了高新科技的洗礼&#xff0c;不知不觉的浸淫在科技带给生活的便利和乐趣。 要说现在炙…...

公司网站 仿站什么意思/seo外链发布平台有哪些

有很多种方法可以用来找出哪些SQL语句需要优化&#xff0c;但是很久以来&#xff0c;最简单的方法都是分析保存在V$SQL视图中的缓存的SQL信息。通过V$SQL视图&#xff0c;可以确定具有高消耗时间、CUP和IO读取的SQL语句。1.查看总消耗时间最多的前10条SQL语句select *from (sel…...

wordpress code/十大暗网搜索引擎

关于OpenCV安装 1.下载和安装OpenCV SDK 在官网&#xff1a;http://opencv.org/上找到OpenCV windows版下载 。 后得到一个 opencv-2.X.X.exe的文件&#xff0c;直接双击解压......如下&#xff1a; 2.配置环境变量&#xff1a; 在path 变量下&#xff0c;新增以下两个值&#…...

百度指数的网站/海外品牌推广

问题描述 今天准备打包上传AppStore&#xff0c;结果Xcode报以下错误&#xff1a; Missing iOS Distribution signing identity for XXXXXX 查看证书后发现&#xff0c;Develop证书和Distribution证书都提示“此证书的签发者无效”。 什么是AppleWWDRCA证书&#xff1f; 搜索…...

做海淘是在哪个网站好/免费注册网页网址

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a; &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是对我最大的激励…...