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

【MySQL进阶篇】存储对象:视图、存储过程及触发器

一、视图

1、介绍

视图(view)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来定义视图的查询中使用的表(基表),并且是在使用视图时动态生成的。

通俗的讲,视图只保存了查询的SQL逻辑,不保存查询结果。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。

2、操作语法

2.1、创建

CREATE [OR REPLACE] VIEW 视图名称[(列名列表)] AS SELECT [WITH[CASCADED | LOCAL] CHECK OPTION]

2.2、查询 

查看创建视图语句:SHOW CREATE VIEW  视图名称;

查看视图数据:SELECT * FROM 视图名称.....; 

 2.3、修改

方式一:CREATE [OR REPLACE] VIEW 视图名称[(列名列表)] AS SELECT [WITH[CASCADED | LOCAL] CHECK OPTION]

方式二:ALTER VIEW 视图名称[(列名列表)] AS SELECT [WITH[CASCADED | LOCAL] CHECK OPTION]

2.4、删除

DROP VIEW [IF EXISTS] 视图名称; 

#创建视图
create or replace view stu_v as select id,name from student where id<=10;
#查询视图
show create view stu_v;
select * from stu_v;
select * from stu_v where id<3;
#修改视图
create or replace view stu_v as select id,name,no from student where id<=10;
alter view stu_v as select id,name from student where id<=10;
#删除视图
drop view if exists stu_v;

 3、检查选项

create or replace view stu_v as select id,name from student where id<=10;
select * from stu_v;
insert into stu_v values(5,'tom');
#视图并不存储数据,数据在基表当中存储,也就意味着我们插入的数据实际上是插入到student表当中了
insert into stu_v values(15,'tom');
#基表当中会包含这条数据,但是在查询视图时并不包含这条数据,这是因为在创建视图时指定了id<=10,为了避免这种情况的发生可以加上检查选项

1.1、试图当中的检查选项

当使用 WITH CHECK OPTION 子句创建视图时,MySQL会通过视图检查正在更改的每个行,例如 插入,更新,删除,以使其符合视图的定义 。MySQL允许基于另一个视图创建视图,它还会检查以来视图中的规则一保持一致性。为了确定检查的范围,MySQL提供了两个选项:CASCADED 和 LOCAL,默认值为CASCADED。

CASCADED:
#CASCADE :
create or replace view stu_v1 as select id,name from student where id<=20;
create or replace view stu_v2 as select id,name from stu_v1 where id>=10 with cascaded check option ;
insert into stu_v2 values(5,'tom');
insert into stu_v2 values(25,'tom');
#都不能插入成功,会检查stu_v2所依赖的底层所有的视图
create or replace view stu_v3 as select id,name from stu_v2 where id<=15;
insert into stu_v3 values(11,'tom');
insert into stu_v3 values(17,'tom');#能执行成功,会在基表中出现该数据,stu_v3视图的条件不需要检查,只需要检查另外两个视图
insert into stu_v3 values(28,'tom');
LOCAL: 
#LOCAL :
create or replace view stu_v_1 as select id,name from student where id<=20;
create or replace view stu_v_2 as select id,name from stu_v_1 where id>=10 with local check option ;
insert into stu_v_2 values(5,'tom');
#需要检查上一个视图的条件但上一个视图没有with check option选项,并且也不满足当前视图的条件
insert into stu_v_2 values(25,'tom');
#满足当前视图的条件,虽然不满足上一个视图的条件,但上一个视图没有with check option选项,因此可以插入
create or replace view stu_v_3 as select id,name from stu_v_2 where id<=15;
insert into stu_v_3 values(11,'tom');
insert into stu_v_3 values(17,'tom');
insert into stu_v_3 values(28,'tom');
#都可以插入进来

 4、更新及作用

4.1、视图的更新

要使视图更新,视图中的行为与基础表中的行之间必须存在一对一的关系。如果试图中包含一下任何一项,则该视图不可更新:

1、聚合函数或窗口函数(SUM()、MAX()、MIN()、COUNT()等)

2、DISTINCT

3、GROUP BY

4、HAVING

5、UNION 与 UNION ALL

4.2、视图的作用

1、简单:试图不仅可以简化用户对数据的理解,也可以简化他们的操作。那些被经常使用的查询可以被定义为视图,从而使得用户不必为以后的操作每次指定全部的条件。

2、安全:数据库可以授权,但不能授权到数据库特定行和特定的列上。通过视图用户只能查询和修改他们所能见到的数据。

3、数据独立:视图可以帮助用户屏蔽真实表结构带来的影响。

二、存储过程

1、介绍

存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程可以简化应用人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。

存储过程思想上很简单,就是数据库SQL语言层面的代码的封装与重用。

2、特点

封装、复用;可以接收参数,也可以返回数据;减少网络交互,效率提升。

3、操作语法

3.1、创建

CREATE PROCEDURE 存储过程名称[(参数列表)]

BEGIN

                --SQL语句

END;

3.2、调用

CALL 名称 [(参数)];

3.3、查看 

SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUINE_SCHEMA='xxx';#查询指定数据库的存储过程及状态信息

SHOW CREATE PROCEDURE 存储过程名称;#查询某个存储过程的定义

3.4、删除

DROP PROCEDURE [IF EXISTS] 存储过程名称; 

#创建
create procedure p1()
beginselect count(*) from student;
end;
#调用
call p1();
#查看
select * from information_schema.ROUTINES where ROUTINE_SCHEMA='test';
show create procedure p1;
#删除
drop procedure if exists p1;

 注意:在命令行中,执行创建存储过程的SQL时,需要通过关键字delimiter 指定SQL的结束符

 delimiter $$
mysql> create procedure p1()-> begin->     select count(*) from student;-> end$$
Query OK, 0 rows affected (0.01 sec)

4、变量

 4.1、系统变量

系统变量是MySQL服务器提供,不是用户定义的,属于服务器层面,分为全局变量(GLOBAL)、会话变量(SESSION)。

4.1.1、查看系统变量

SHOW [SESSION | GLOBAL] VARIABLES;#查看所有系统变量

SHOW [SESSION | GLOBAL] VARIABLES LIKE'....';#可以通过LIKE模糊匹配的方式查找变量

SELECT @@[SESSION | GLOBAL] 系统变量名;#查看指定变量的值

4.1.2、设置系统变量

SET [SESSION | GLOBAL] 系统变量名=值;

SET @@[SESSION |GLOBAL] 系统变量名=值; 

#查询系统变量
show session variables;
show session variables like 'auto%';#查看与事务自动提交相关的变量
select @@session.autocommit;
#设置系统变量
set session autocommit=0;
set @@session.autocommit=1;

注意:

1、如果没有指定SESSION/GLOBAL默认是SESSION会话变量;

2、MySQL服务器重启之后,所设置的全局参数会失效。

4.2、自定义变量

用户自定义变量是用户根据需要自己定义的变量,用户变量不用提前声明,在用的时候直接用“@变量名”使用就可以。其作用域为当前连接。

4.2.1、用户变量赋值

SET @var_name=expr [,@var_name=expr]...;

SET @var_name:=expr [,@var_name:=expr]...;

推荐使用:=因为在MySQL中判断相等与赋值都是用的=,为了避免混淆,用:=。 

SELECT @var_name:=expr [,@var_name:=expr]...;

SELECT 字段名 INTO @var_name FROM 表名; 

4.2.2、用户变量使用

SELECT @var_name; 

#用户变量赋值
set @myname='test';
set @myage:='10',@mygender:='男';
select @mycolor:='black';
select count(*) into @mycount from tb_user
#使用自定义变量
select @myname,@myage,@mygender;

 注意:用户定义的变量无需对其进行声明或优化,只不过获取到的值为NULL。

4.3、局部变量

局部变量是根据需要定义在局部生效的变量,访问之前,需要DECLARE声明。可用作存储过程内的局部变量和输入参数,局部变量的范围是在其内声明的BIGINT...END块。

4.3.1、局部变量的声明

DECLARE 变量名 变量类型 [FEFAULT ...];

变量类型就是数据库字段类型:INT、BIGINT、VARCHAR、DATE、TIME等。 

4.3.2、局部变量赋值

SET 变量名=值;

SET 变量名:=值;

SELECT 字段名 INTO 变量名 FROM 表名...; 

#局部变量的声明和赋值
create procedure p2()
begindeclare stu_count int default 0;set stu_count:=100;#select count(*) into stu_count from student;select stu_count;
end;
call p2();

 5、if判断

5.1、语法结构

IF 条件1 THEN

                ...

ELSE 条件2 THEN

                ...

ELSE

                ...

END IF;

#需求:更具定义的分数score变量,判断对应等级
#1、score>=85,等级为优秀
#2、score>=60并且score<85,等级为及格
#3、score<60,等级不及格
create procedure p1()
begindeclare score int default 58;declare result varchar(10);if score>=85 thenset result:='优秀';elseif score>=60 and score<85 thenset result:='及格';elseset result:='不及格';end if;select result;
end;
call p1();

 6、存储过程的参数

类型含义备注
IN该类参数作为输入,也就是调用时需要传入值默认
OUT该类参数作为输出,也就是该参数可以作为返回值
INOUT既可以作为输入参数,也可以作为输出参数

6.1、语法 

CREATE PROCEDURE 存储过程名称([IN/OUT/INOUT 参数值 参数类型])

BEGIN

        --SQL语句

END;

#存储过程中的参数
#1、需求:根据传入参数的分数score,判断对应等级,并返回
#score>=85,等级为优秀
#score>=60并且score<85,等级为及格
#score<60,等级不及格
create procedure p2(in score int,out result varchar(10))
beginif score>=85 thenset result:='优秀';elseif score>=60 and score<85 thenset result:='及格';elseset result:='不及格';end if;
end;
call p2(68,@result);
select @result;
#2、将传入的200分制的分数进行换算,换算成百分制,然后返回
create procedure p3(inout score double)
beginset score :=score*0.5;
end;
set @score:=78;
call p3(@score);
select @score;

 7、case

7.1、语法

语法一

CASE case_value

                WHEN then_value1 THEN statement_list1

                [WHEN then_value2 THEN statement_list2]

                [ELSE statement_list]

END CASE;

语法二

CASE

                WHEN search_condition1 THEN statement_list1

                [WHEN search_condition2 THEN statement_list2]

#需求:根据传入的月份,判断月份所属的季度(采用case结构)
#1、1-3月份,第一季度
#2、4-6月份,第二季度
#3、7-9月份,第三季度
#4、10-12月份,第四季度
create procedure p4(in month int)
begindeclare result varchar(10);casewhen month>=1 and month<=3 thenset result:='第一季度';when month>=4 and month<=6 thenset result:='第二季度';when month>=7 and month<=9 thenset result:='第三季度';when month>=10 and month<=12 thenset result:='第四季度';elseset result:='非法参数';end case;select concat('您输入的月份为:',month,'所属季度:',result);
end;
call p4(16);

 8、while循环

while循环是有条件的循环控制语句。满足条件后,再执行循环体中的SQL语句。

语法结构:

#先判定条件,如果条件为true,则执行逻辑,否则不执行

WHILE 条件 DO

        SQL语句...

END WHILE;

#需求:计算从1累加到n的值,n为传入的参数值
#A.定义局部变量,用来记录累加之后的值
#B.每循环一次n-1,知道满足n<0,则不再循环
create procedure p5(in n int)
begindeclare sum int default 0;while n>0 doset sum:=sum+n;set n:=n-1;end while;select sum;
end;
call p5(10);

 9、repeat循环

repeat是有条件的控制语句,当满足条件的时候退出循环。

语法结构:

#先执行一次逻辑,然后判断逻辑是否满足,如果满足则退出,反之则进行下一次循环

REPEAT

        SQL逻辑...

        UNTIL 条件

END REPEAT;

create procedure p6(in n int)
begindeclare sum int default 0;repeatset sum :=sum+n;set n :=n-1;until n<=0end repeat;select sum;
end;
call p6(10);

 10、loop循环

loop实现简单的循环,如果不在SQL逻辑中增加退出循环的条件,可以用其实现简单的死循环。loop可以配合以下两个语句使用:

· LEAVE:退出循环。

· ITERATE:必循用在循环中,作用是跳过当前语句剩下的语句,直接进入下一次循环。

[begin_label:] LOOP

        SQL 逻辑...

END LOOP [end_lable];

LEAVE lable;#跳出循环

ITERATE lable;#进入下一次循环 

#需求:计算从1累加到n的值,n为传入的参数值
#A.定义局部变量,用来记录累加之后的值
#B.每循环一次n-1,知道满足n<0,则不再循环
create procedure p7(in n int)
begindeclare sum int default 0;total:loopif n<=0 thenleave total;end if;set sum :=sum+n;set n :=n-1;end loop total;select sum;
end;
call p7(10);
#需求:计算从1到n之间偶数的累加值,n为传入的参数值
create procedure p8(in n int)
begindeclare sum int default 0;total:loopif n<=0 thenleave total;elseif n%2=1 thenset n:=n-1;iterate total;end if;set sum :=sum+n;set n :=n-2;end loop total;select sum;
end;
call p8(10);

11、游标(cursor) 

create procedure p9()
begindeclare stu_count int default 0;select * into stu_count from student;select stu_count;
end;
call p9();
#会报这样一条错误:The used SELECT statements have a different number of columns

这个时候就需要游标了。

游标是用来存储查询结果集的数据类型,在存储过程和函数中可以使用游标对结果集进行循环的处理,游标的使用包括游标的声明、OPEN、FETCH和CLOSE。

11.1操作语法

声明游标:

DECLARE 游标名称 CURSOR FOR 查询语句;  

打开游标:

OPEN 游标名称; 

 获取游标记录:

FETCH 游标名称 INTO 变量[,变量];

关闭游标:

CLOSE 游标名称; 

11.2、条件处理程序

条件处理程序可以用来定义在流程控制结构执行过程中遇到问题时相应的处理步骤。具体语法:

DECLARE handler_action HANDLER condition_value [,condition_vakue]...statement;

handler_action

        CONTINUE:继续执行当前程序

        EXIT:终止执行当前程序

condition_value

        SQLSTATE sqlstate_value:状态码,如02000

        SQLWARNING:所有以01开头的SQLSTATE代码的简写

        NOT FOUND: 所有以01开头的SQLSTATE代码的简写

        SQLEXCEPTION:所有没有被SQLWARNING或NOT FOUND捕获的SQLSTATE代码的简写

#需求:根据传入的参数uage,用来查询用户表tb_user中,所有用户年龄小于等于uage的用户姓名(name)和专业(profession)
#并将用户的姓名和专业插入到所创建的一张新表(id,name,profession)中
#A.声明游标,存储查询结果集
#B.创建表结构
#C.开启游标
#D.获取游标中的记录
#E.插入数据到新表中
#F.关闭游标
create procedure p9(in uage int)
begindeclare u_name varchar(10);declare u_profession varchar(20);declare u_cursor cursor for select name,profession from tb_user where age<=uage;declare exit handler for SQLSTATE '02000' close u_cursor;create table if not exists tb_user_pro(id int primary key auto_increment,name varchar(10) ,profession varchar(20));open u_cursor;while true dofetch u_cursor into u_name,u_profession;insert into tb_user_pro values(null,u_name,u_profession);end while;close u_cursor;
end;

三、存储函数

存储函数是有返回值的存储过程,存储函数的参数只能是IN类型的。具体语法:

CREATE FUNCTION 存储过程名称[(参数列表)]

RETURNS type [characteristic ...]

BEGIN

                --SQL语句

                RETURN...;

END;

characterstic说明:

DETERMINISTIC:相同的输入参数总是产生相同的结果

NO SQL:不包含SQL语句

READS SQL DATA:包含读取数据的语句,但不包含写入数据的语句

#从1到n的累加
create function fun(n int)
returns int deterministic
begindeclare sum int default 0;while n>0 doset sum:=sum+n;set n:=n-1;end while;return sum;
end;
select fun(100);

四、触发器

触发器是与表有关的数据库对象,指在insert/update/delete之前或之后,触发并执行触发器中定义的SQL语句集合。触发器这种特性可以协作应用在数据库端确保数据的完整性,日志记录,数据校验等操作。

使用别名OLD和NEW来引用触发器中发生变化的记录内容,者与其他的数据库是相似的。现在触发器还只支持行级触发,不支持语句级触发。

触发器类型NEW和OLD
INSERT型触发器NEW表示将要或已经新增的数据
UPDATE型触发器OLD表示修改之前的数据,NEW表示将要修改或修改后的数据
DELETE型触发器OLD表示将要货已经删除的数据

 创建:

CREATE TRIGGER trigger_name

BEDORE/AFTER INSERT/UPDATE/DELETE ON table_name FOR EACH ROW

BEGIN

        trigger_stmt;

END;

查看:

 SHOW TRIGGERS;

删除:

DROP TRIGGER [schema_name.] trigger_name;#如果没有指定schema_name.默认当前数据库 

#需求:通过触发器记录user表的数据变更日志(user_logs),包含增加,修改、删除
create table user_log(id int(11) not null auto_increment,operation varchar(20) not null comment '操作类型,insert/update/delete',operate_time datetime not null comment '操作时间',operate_id int(11) not null comment '操作的ID',operate_params varchar(500) comment '操作参数',primary key (`id`)
)engine=innodb default charset =utf8;
#插入数据的触发器
create trigger insert_triggerafter insert on tb_user for each row
begininsert into user_log(id, operation, operate_time, operate_id, operate_params) values(null,'insert',now(),new.id,concat('插入的数据内容为:id=',new.id,'name=',new.name,'phone=',new.phone,'profession=',new.profession));
end;
#插入数据到tb_user表,验证
insert into tb_user values(5,'二秃子',66,'1','12345678910','通信工程');
#修改数据的触发器
create trigger update_triggerafter update on tb_user for each row
begininsert into user_log(id, operation, operate_time, operate_id, operate_params) values(null,'update',now(),new.id,concat('更新之前的数据:id=',old.id,'name=',old.name,'phone=',old.phone,'profession=',old.profession,'更新之后的数据:id=',new.id,'name=',new.name,'phone=',new.phone,'profession=',new.profession));
end;
update tb_user set age =56 where age=55;
#删除数据的触发器
create trigger delete_triggerafter delete on tb_user for each row
begininsert into user_log(id, operation, operate_time, operate_id, operate_params) values(null,'delete',now(),old.id,concat('删除之前的数据:id=',old.id,'name=',old.name,'phone=',old.phone,'profession=',old.profession));
end;
delete from tb_user where id=5;
show triggers;

相关文章:

【MySQL进阶篇】存储对象:视图、存储过程及触发器

一、视图 1、介绍 视图&#xff08;view&#xff09;是一种虚拟存在的表。视图中的数据并不在数据库中实际存在&#xff0c;行和列数据来定义视图的查询中使用的表&#xff08;基表&#xff09;&#xff0c;并且是在使用视图时动态生成的。 通俗的讲&#xff0c;视图只保存了…...

算法day05 master公式估算递归时间复杂度 归并排序 小和问题 堆排序

2.认识O(NlogN)的排序_哔哩哔哩_bilibili master公式 有这样一个数组&#xff1a;【0&#xff0c;4&#xff0c;2&#xff0c;3&#xff0c;3&#xff0c;1&#xff0c;2】&#xff1b;假设实现了这样一个sort()排序方法&#xff0c; 将数组二分成左右两等分&#xff0c;使用so…...

基于jeecgboot-vue3的Flowable流程仿钉钉流程设计器-支持VForm3表单的选择与支持

因为这个项目license问题无法开源&#xff0c;更多技术支持与服务请加入我的知识星球。 1、初始化的时候加载表单 /** 查询表单列表 */ const getFormList () > {listForm().then(res > formOptions.value res.result.records) } 2、开始节点的修改&#xff0c;增加表…...

【刷题汇总 -- 压缩字符串(一)、chika和蜜柑、 01背包】

C日常刷题积累 今日刷题汇总 - day0181、压缩字符串(一)1.1、题目1.2、思路1.3、程序实现 2、chika和蜜柑2.1、题目2.2、思路2.3、程序实现 3、 01背包3.1、题目3.2、思路3.3、程序实现 -- dp 4、题目链接 今日刷题汇总 - day018 1、压缩字符串(一) 1.1、题目 1.2、思路 读完…...

《Exploring Aligned Complementary Image Pair for Blind Motion Deblurring》

这篇论文的标题《Exploring Aligned Complementary Image Pair for Blind Motion Deblurring》可以翻译为《探索对齐的互补图像对用于盲运动去模糊》。从标题可以推断,论文的焦点在于开发一种算法或技术,利用成对的图像来解决运动模糊问题,特别是在不知道模糊核(即造成模糊…...

vue2学习笔记9 - 通过观察vue实例中的data,理解Vue中的数据代理

接着上一节&#xff0c;学一学vue中的数据代理。学vue这几天&#xff0c;最大的感受就是&#xff0c;名词众多&#xff0c;听得发懵。。不过&#xff0c;深入理解之后&#xff0c;其实说得都是一回事。 在Vue中&#xff0c;数据代理是指在实例化Vue对象时&#xff0c;将data对…...

04 Git与远程仓库

第4章&#xff1a;Git与远程仓库 一、Gitee介绍及创建仓库 一&#xff09;获取远程仓库 ​ 使用在线的代码托管平台&#xff0c;如Gitee&#xff08;码云&#xff09;、GitHub等 ​ 自行搭建Git代码托管平台&#xff0c;如GitLab 二&#xff09;Gitee创建仓库 ​ gitee官…...

数据库之表的查询

一.新建表&#xff1a; mysql> create table t_worker(-> department_id int(11) not null comment部门号,-> worker_id int(11) primary key not null comment职工号,-> worker_date date not null comment工作时间,-> wages float(8,2) not null comment工资,…...

String 和StringBuilder字符串操作快慢的举例比较

System.currentTimeMillis(); //当前时间与1970年1月1日午夜UTC之间的毫秒差。public class HelloWorld {public static void main(String[] args) {String s1 "";StringBuilder s2 new StringBuilder("");long time System.currentTimeMillis();long s…...

Java代码基础算法练习-竞猜卡片值-2024.07.22

任务描述&#xff1a; 小米和小王玩竞猜游戏&#xff1a;准备7张卡片包含数字2、3、4、5、6、7、8&#xff0c;从中抽出2张&#xff08;有 顺序之分&#xff0c;抽2、3跟抽3、2是两种情况&#xff09;&#xff0c;猜2张卡片的和&#xff0c;如果是奇数&#xff0c;则猜对。小米…...

Python爬虫-淘宝搜索热词数据

前言 本文是该专栏的第70篇,后面会持续分享python爬虫干货知识,记得关注。 在本专栏之前,笔者有详细针对“亚马逊Amazon搜索热词”数据采集的详细介绍,对此感兴趣的同学,可以往前翻阅《Python爬虫-某跨境电商(AM)搜索热词》进行查看。 而在本文,笔者将以淘宝为例,获取…...

Leetcode二分搜索法浅析

文章目录 1.二分搜索法1.1什么是二分搜索法&#xff1f;1.2解法思路1.3扩展 1.二分搜索法 题目原文&#xff1a; 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值…...

昇思25天学习打卡营第24天|ResNet50迁移学习

课程打卡凭证 迁移学习 迁移学习是机器学习中一个重要的技术&#xff0c;通过在一个任务上训练的模型来改善在另一个相关任务上的表现。在深度学习中&#xff0c;迁移学习通常涉及在一个大型数据集&#xff08;如ImageNet&#xff09;上预训练的模型上进行微调&#xff0c;以便…...

Shell 构建flutter + Navtive 生成IPA

具体实现: #1. 在工程的根目录下,建立文件夹build_iOS文件,在此文件下建立build_iOS.sh的文件,把以下内容copy进sh文件;build_iOS.sh 就是第5步之后整个的脚本内容。 #2. 进入build_iOS.sh 文件的目录; #3. 在build_iOS 文件夹配置打包的DEVELOPExportOptionsPlist…...

python gradio 的输出展示组件

HTML&#xff1a;展示HTML内容&#xff0c;适用于富文本或网页布局。JSON&#xff1a;以JSON格式展示数据&#xff0c;便于查看结构化数据。KeyValues&#xff1a;以键值对形式展示数据。Label&#xff1a;展示文本标签&#xff0c;适用于简单的文本输出。Markdown&#xff1a;…...

SwiftUI 6.0(Xcode 16)新 PreviewModifier 协议让预览调试如虎添翼

概览 用 SwiftUI 框架开发过应用的小伙伴们都知道&#xff0c;SwiftUI 中的视图由各种属性和绑定“扑朔迷离”的缠绕在一起&#xff0c;自成体系。 想要在 Xcode 预览中泰然处之的调试 SwiftUI 视图有时并不是件容易的事。其中&#xff0c;最让人秃头码农们头疼的恐怕就要数如…...

STM32被拔网线 LWIP的TCP无法重连解决方案

目录 一、问题描述 二、项目构成 三、问题解决 1.问题代码 2.解决思路 3.核心代码&#xff1a; 四、完整代码 1.监测网口插入拔出任务 2.TCP任务 3.创建tcp任务 4.删除tcp任务 五、总结 一、问题描述 最近遇到一个问题&#xff0c;就是我的stm32设备作为tcp客户端…...

Linux下开放指定端口

比如需要开放82端口&#xff1a; #查询是否开通 firewall-cmd --query-port82/tcp#开放端口82 firewall-cmd --zonepublic --add-port82/tcp --permanent#重新加载防火墙 firewall-cmd --reload...

亚马逊测评行为的识别与防范:教你如何搭建安全的测评环境

亚马逊平台以其严格的内部系统和精密的买家信息对比机制而闻名。一旦发现买家存在不当评价行为&#xff0c;系统会立即展开深入的调查&#xff0c;追溯其所有的购买和评价记录。如果确认该买家存在补评价的行为&#xff0c;那么他/她之前留下的所有评价都可能会被系统自动删除。…...

如何通过成熟的外发平台,实现文档安全外发管理?

文档安全外发管理是企业信息安全管理的重要组成部分&#xff0c;它涉及到企业向外发送的文件&#xff0c;需要进行严格的控制和管理&#xff0c;防止敏感或机密信息的泄露。以下是一些关键考虑因素&#xff1a; 文件外发的挑战&#xff1a;企业在文件外发时面临的主要挑战包括…...

SCI一区级 | Matlab实现SSA-CNN-GRU-Multihead-Attention多变量时间序列预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.【SCI一区级】Matlab实现SSA-CNN-GRU-Multihead-Attention麻雀算法优化卷积门控循环单元融合多头注意力机制多变量时间序列预测&#xff0c;要求Matlab2023版以上&#xff1b; 2.输入多个特征&#xff0c;输出单个…...

Mysql中的几种常见日志

引言 本文是对Mysql中几种常见日志及其作用的介绍 一、error log&#xff08;错误日志&#xff09; MySQL 中的 error log&#xff08;错误日志&#xff09;是一种非常重要的日志类型&#xff0c;它记录了 MySQL 服务器在启动、运行及关闭过程中遇到的所有重要事件、错误信…...

2024年7月22日(nfs samba)

一、webserver 服务器&#xff1a;作用是发布nginx的web项目 1、安装nginx&#xff08;只下载不安装&#xff09; [rootweb_server ~]# yum -y install --downloadonly --downloaddir./soft/ nginx 2、配置一个本地的nginx仓库 [rootweb_server ~]# yum -y install createrepo…...

黑龙江网络安全等级保护测评策略概述

一、简介 黑龙江省网络安全等级保护测评策略是为了保障信息系统安全稳定运行&#xff0c;根据《网络安全法》和相关国家标准制定的综合性安全评估和加固过程。该策略不仅要求企业和机构明确自身信息系统的安全等级&#xff0c;还指导其实施相应的技术防护与管理措施&#xff0…...

笔记 7 :linux 011 注释,函 bread () , get_hash_table () , find_buffer ()

&#xff08;57&#xff09;接着介绍另一个读盘块的函数 bread&#xff0c;以及释放 bh 的函数 brelse&#xff08; &#xff09;&#xff1a; &#xff08;58&#xff09;因为 函数 get_blk&#xff08;&#xff09;大量调用了其它函数&#xff0c;一版面列举不完&#xff0c;…...

vscode配置latex环境制作【文档、简历、resume】

vscode配置latex环境制作【文档、简历、resume】 1. 安装Tex Live及vscode插件 可以参考&#xff1a;vscode配置latex环境制作beamer ppt 2. 添加vscode配置文件 打开vscode&#xff0c;按下Ctrl Shift P打开搜索框&#xff0c;搜索Preference: Open User Settings (JSON…...

如何学习Spark:糙快猛的大数据之旅

作为一名大数据开发者,我深知学习Spark的重要性。今天,我想和大家分享一下我的Spark学习心得,希望能够帮助到正在学习或准备学习Spark的朋友们。 目录 Spark是什么?学习Spark的"糙快猛"之道1. 不要追求完美,在实践中学习2. 利用大模型作为24小时助教3. 根据自己的节…...

交换机(Switches)和桥(Bridges)的区别

交换机&#xff08;Switches&#xff09;和桥接器&#xff08;Bridges&#xff09;在网络和通信领域中都起着重要作用&#xff0c;它们有一些共同点&#xff0c;但也有一些显著的区别&#xff1a; 工作层次&#xff1a; 桥接器&#xff08;Bridges&#xff09;&#xff1a;桥接…...

基于springboot+vue的汽车租赁管理系统

摘要 在当今快速发展的数字化时代&#xff0c;汽车租赁行业作为现代服务业的重要组成部分&#xff0c;正面临着前所未有的机遇与挑战。为提升管理效率、优化用户体验并促进业务增长&#xff0c;我们设计并实现了一套基于Spring Boot后端框架与Vue.js前端技术的汽车租赁管理系统…...

《0基础》学习Python——第二十二讲__网络爬虫/<5>爬取豆瓣电影封面图

一、爬取豆瓣电影的图片封面 1、经过上节课我们所爬取的豆瓣电影的电影名、年份、国家、导演、主演、剧情&#xff0c;那么接下来我们将学习如何去爬取这些电影的图片&#xff0c;并将这些图片存放在文件夹中。 2、过程实现&#xff1a; 2.1、获取网页源码 首先还是和爬取电影名…...

做网站要买多少服务器空间/比较好的软文发布平台

使用模拟器运行应用或者是游戏的时候&#xff0c;发现模拟器无法运行不然就是卡顿&#xff0c;这时候需要确认是不是电脑问题引起的模拟器问题&#xff0c;客服一般会请求并索要你的电脑配置来进一步解决问题&#xff1b;而很多模拟器小白不知道如何查看电脑配置&#xff0c;查…...

潍坊网站的公司电话/seo查询seo

一&#xff0c;利用网站浏览器F12键&#xff0c;利用谷歌浏览器插件找到视频的.m3u8文件&#xff0c;并打开。 二&#xff0c;打开m3u8文件后&#xff0c;里面有很多.ts的链接&#xff0c;和key的链接。 三&#xff0c;保存为html文件&#xff0c;下载ts文件&#xff0c;代码如…...

网站开发的调研/最新热点新闻

主目录下有3文件ratioimg.htmlratioimg.phpimage文件夹&#xff0c;请新建此文件夹ratioimg.html-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>上传图片ratioimg.php-//W3C//DTD XHTML 1.0 Transitional//EN” “…...

网页设计培训计划/百度搜索优化平台

作者&#xff1a;LeonLok编译&#xff1a;ronghuaiyang导读本文来自github&#xff0c;很实用的一个应用。git仓库地址&#xff1a;https://github.com/LeonLok/Multi-Camera-Live-Object-Tracking这个存储库包含了我的目标检测和跟踪项目。所有这些都可以托管在云服务器上。由…...

贴吧网站怎么做/seo关键词排名优化app

作者&#xff1a;13 GitHub&#xff1a;https://github.com/ZHENFENG13 版权声明&#xff1a;本文为原创文章&#xff0c;未经允许不得转载。 Lombok简介 Lombok是Java语言的实用工具&#xff0c;确切的说&#xff0c;应该说是一个很好用的插件&#xff0c;对&#xff0c;插件&…...

织梦同时运行多个网站/站长工具权重

过滤用户数据是Web应用安全的基础。它是验证数据合法性的过程。通过对所有的输入数据进行过滤,可以避免恶意数据在程序中被误信或误用。大多数Web应用的漏洞都是因为没有对用户输入的数据进行恰当过滤所引起的。 我们介绍的过滤数据分成三个步骤: 1、识别数据,搞清楚需要过…...