MySQL 视图(2)

上一篇:MySQL视图(1)


基于其他视图

案例对 WITH [CASCADED | LOCAL] CHECK OPTION 进行释义

创建视图时,可以基于表 / 多个表,也可以使用 其他视图+表 / 其他视图 + 其他视图 的方式进行组合。

总结

  • 更新视图,同时也会更新基表数据。更新基表,对应的视图数据也会更新。
  • WITH CASCADED CHECK OPTION 会检测当前视图(v3)WHERE 子句约束以及所有底部视图 WHERE 子句约束条件(v1/v2)
  • 当使用 CASCADED 时,不仅需要满足当前视图 WHERE 子句约束,而且无论底部视图是否有 WITH CHECK OPTION 选项,都需要满足
drop table t1;
drop view v1,v2,v3;CREATE TABLE t1 (a INT);CREATE VIEW v1 AS SELECT * FROM t1 WHERE a < 10
WITH CHECK OPTION;CREATE VIEW v2 AS SELECT * FROM v1 WHERE a > 4
WITH LOCAL CHECK OPTION;CREATE VIEW v3 AS SELECT * FROM v2 WHERE a < 8
WITH CASCADED CHECK OPTION;INSERT INTO v3 values(9); -- 报错,不符合 v3 视图中小于8的约束
INSERT INTO v3 values(4); -- 报错,不符合 v2 视图中大于4的约束
INSERT INTO v3 values(11);-- 报错,不符合 v1 视图中大于4的约束
INSERT INTO v3 values(6); -- 正常,符合 v1/v2/v3 视图约束
INSERT INTO v3 values(7); -- 正常,符合 v1/v2/v3 视图约束
  • WITH [CASCADED | LOCAL] CHECK OPTION 均会检测多层视图,如下案例,插入 v3 视图数据时,会检测 v1、v2 的数据约束条件
  • with local check option 时,首先需要满足当前视图的条件,然后对于底部视图,也是先看是否有指定的 with check option 选项语句,有的话对应处理,无则不需要满足底部视图的 WHERE 子句条件。
drop table t1;
drop view v1,v2,v3;CREATE TABLE t1 (a INT);CREATE VIEW v1 AS SELECT * FROM t1 WHERE a < 10
WITH CHECK OPTION;-- 没有 check option 选项
CREATE VIEW v2 AS SELECT * FROM v1 WHERE a > 4; CREATE VIEW v3 AS SELECT * FROM v2 WHERE a < 14
WITH LOCAL CHECK OPTION;INSERT INTO v3 values(3); -- 正常,因为基表 v2 没有 check option 所以不做约束
INSERT INTO v3 values(4); -- 正常,因为基表 v2 没有 check option 所以不做约束
INSERT INTO v3 values(11);-- 报错,必须符合基表 v1 小于10的约束,因为有check option 选项
INSERT INTO v3 values(10);-- 报错,必须符合基表 v1 小于10的约束,因为有check option 选项-- 初始化环境
drop table t1;
drop view v1,v2,v3;CREATE TABLE t1 (a INT);CREATE VIEW v1 AS SELECT * FROM t1 WHERE a < 10
WITH CHECK OPTION;-- 有 local check option 选项
CREATE VIEW v2 AS SELECT * FROM v1 WHERE a > 4 
WITH LOCAL CHECK OPTION;CREATE VIEW v3 AS SELECT * FROM v2 WHERE a < 14
WITH LOCAL CHECK OPTION;INSERT INTO v3 values(3); -- 报错,必须符合基表 v2 大于 4 的约束,因为有check option选项
INSERT INTO v3 values(4); -- 报错,必须符合基表 v2 大于 4 的约束,因为有check option选项

当前视图没有 check option 约束时,可以更新当前视图数据,但是在当前视图中不显示该数据(参考情况1)。同时需要保证在该视图的 select_statement 中,如果对象是视图,并且也没有 check option 约束限制(参考情况2),有也没事,但是不能限制,才可以正常插入、更新数据(参考情况3)。

-- 情况 1:视图无 check option 选项,关联表
drop table t1;
drop view v1,v2,v3;
CREATE TABLE t1 (a INT);
CREATE VIEW v1 AS SELECT * FROM t1 WHERE a < 10;
INSERT INTO v1 values(15);  -- 正常,因为没有 check option可以更新,但是在视图中不显示而已。-- 情况 2:视图无 check option 选项,关联其他视图也无 check option 选项
drop table t1;
drop view v1,v2,v3;
CREATE TABLE t1 (a INT);
CREATE VIEW v1 AS SELECT * FROM t1 WHERE a < 10
WITH CHECK OPTION;-- 没有 check option 选项
CREATE VIEW v2 AS SELECT * FROM v1 WHERE a > 4; 
CREATE VIEW v3 AS SELECT * FROM v2 WHERE a < 14;INSERT INTO v3 values(3); -- 正常,因为基表 v2 没有 check option 所以不做约束
INSERT INTO v3 values(4); -- 正常,因为基表 v2 没有 check option 所以不做约束
INSERT INTO v3 values(11);-- 报错,必须符合基表 v1 小于10的约束,因为有check option 选项
INSERT INTO v3 values(15);-- 报错,必须符合基表 v1/v3 的约束,因为有check option 选项-- 情况 3:视图无 check option 选项,关联其他视图有 check option 选项
drop table t1;
drop view v1,v2,v3;
CREATE TABLE t1 (a INT);
CREATE VIEW v1 AS SELECT * FROM t1 WHERE a < 10
WITH CHECK OPTION;-- 有 check option 选项
CREATE VIEW v2 AS SELECT * FROM v1 WHERE a > 4 
WITH CHECK OPTION; 
CREATE VIEW v3 AS SELECT * FROM v2 WHERE a < 14;INSERT INTO v3 values(3); -- 报错,必须符合视图 v2 大于4的约束,因为有check option 选项
INSERT INTO v3 values(5); -- 正常

基于 WITH 通用表达式

CREATE VIEW t1_view as WITHcte1 AS (SELECT 1 as a, 2 as b FROM dual),cte2 AS (SELECT 1 as c, 4 as d FROM dual)
SELECT b, d FROM cte1 JOIN cte2
WHERE cte1.a = cte2.c;SELECT * FROM t1_view;
+---+---+
| b | d |
+---+---+
| 2 | 4 |
+---+---+
1 row in set (0.00 sec)CREATE VIEW t1_view as WITHcte1 AS (SELECT 1 as a, 2 as b FROM dual),cte2 AS (SELECT 1 as c, 4 as d FROM dual)
SELECT * FROM cte1 JOIN cte2
WHERE cte1.a = cte2.c;SELECT * FROM t1_view;
+---+---+---+---+
| a | b | c | d |
+---+---+---+---+
| 1 | 2 | 1 | 4 |
+---+---+---+---+
1 row in set (0.00 sec)

基于 CASE WHEN

  • 直接使用不支持,但可以在 SELECT 里面
CREATE TABLE `t1` (`id` int NOT NULL AUTO_INCREMENT,`consumer` char(20) DEFAULT NULL,`brand` varchar(20) DEFAULT NULL,`sal` int DEFAULT NULL,PRIMARY KEY (`id`)
);
INSERT INTO t1 VALUES(1,'人民','苹果',5000);
INSERT INTO t1 VALUES(2,'苏教','小米',-4000);
INSERT INTO t1 VALUES(3,'深教','oppo',0);CREATE VIEW t1_view AS SELECT id, sal, sign(CASE WHEN sal=0 THEN 200 ELSE sal END ) FROM t1 ORDER BY id;

基于自定义存储函数

MySQL :: MySQL 8.0 Reference Manual :: 15.1.23 CREATE VIEW Statement # create view

单个存储函数

DELIMITER //
CREATE FUNCTION f_test()
returns varchar(20)
BEGINdeclare a varchar(200);SELECT CONCAT('111','222','333') FROM DUAL INTO a;return a;
END;
//
DELIMITER ;
CREATE VIEW t1_view AS SELECT f_test();

存储函数+存储过程

  • 创建自定义函数的视图,以下案例中,不允许在过程中更新自个儿的视图,个人理解是先执行存储过程中的 UPDATE 语句,再创建视图相关数据,或者理解成,作为视图依据的这个结果集,是不允许被更新的。
DROP VIEW t9_view;
DROP FUNCTION f_test;
DROP PROCEDURE p_test;DELIMITER //
CREATE FUNCTION f_test(samplename varchar(200))
RETURNS varchar(13)  
beginIF samplename IS NOT NULL thenCALL p_test(1);END IF;RETURN 0;
END;
//
CREATE PROCEDURE p_test(in p_in int)
BEGINUPDATE t9_view SET aa = p_in;
END;
//
DELIMITER ;CREATE VIEW t9_view(aa) AS SELECT f_test('xxxx');SELECT * FROM t9_view;
ERROR 1424 (HY000): Recursive stored functions and triggers are not allowed.

  • 创建自定义函数的视图,以下案例中,允许在过程中更新其他的表 / 视图
DROP VIEW t9_view;
DROP FUNCTION f_test;
DROP PROCEDURE p_test;
DROP TABLE t1;
CREATE TABLE t1 (id int);
INSERT INTO t1 VALUES(1);DELIMITER //
CREATE FUNCTION f_test(samplename varchar(200))
RETURNS varchar(13)  
beginIF samplename IS NOT NULL thenCALL p_test(3);END IF;RETURN 0;
END;
//
CREATE PROCEDURE p_test(in p_in int)
BEGINupdate t1 set id=p_in;
END;
//
DELIMITER ;
CREATE VIEW t9_view(aa) AS SELECT f_test('xxxx');
SELECT * FROM t9_view;
+------+
| aa   |
+------+
| 0    |
+------+
1 row in set (0.01 sec)mysql> SELECT * FROM t1;
+------+
| id   |
+------+
|    3 |
+------+
1 row in set (0.00 sec)

  • 视图可能依赖于存储函数,该函数可能调用其他存储例程。例如,以下视图调用存储函数f():
CREATE VIEW v AS SELECT * FROM t WHERE t.id = f(t.name);Suppose that f() contains a statement such as this:IF name IS NULL thenCALL p1();
ELSECALL p2();
END IF;

上面是官方案例,下面案例是我自己写的

CREATE TABLE t1 (id int NOT NULL,consumer char(20) DEFAULT NULL,price varchar(20) DEFAULT NULL,sal int DEFAULT NULL,datetime1 DATE,`datetime2` bigint
);
INSERT INTO t1 VALUES(1,'书局','7000',5000,'2020-09-22',20200923121200);
INSERT INTO t1 VALUES(2,'微山','3000',-4000,'2020-09-21',20200921101159);
INSERT INTO t1 VALUES(3,'深咖','5000',0,'2020-08-21',20190821101159);DELIMITER //
CREATE FUNCTION f_test(samplename varchar(200))
returns varchar(13)  
beginIF samplename IS NOT NULL thenCALL p_test(4);END IF;RETURN 4;
END;
//
CREATE PROCEDURE p_test(in p_in int)
beginupdate t1 set id=p_in;
END;
//
DELIMITER ;CREATE VIEW t9_view AS SELECT * FROM t1 WHERE t1.id = f_test(t1.consumer);
SELECT * FROM t9_view;
ERROR 1442 (HY000): Can't update table 't1' in stored function/trigger 
because it is already used by statement which invoked this stored function/trigger.

总结:

1)不支持递归存储函数,即创建自定义函数视图,在自定义函数体中调用存储过程,过程会更改该视图相关信息,参考案例 一

2)创建自定义函数的视图,允许在过程中更新其他的表 / 视图,参考案例 二

3)综合案例1~3来看,使用函数的方式创建视图,无论是直接 SELECT 函数 还是 以函数作为 WHERE 子句的条件来创建的视图,在函数 / 过程中都不能 INSERT / UPDATE 创建视图时的基础表(insert操作验证过,未写出来)。

ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}

Merge:当使用视图时,会把查询视图的语句创建视图的语句合并起来,形成一条语句,最后再从基表中查询

TEMPTABLE:先把定义视图的语句执行起来,把数据放在一张系统定义的临时表,然后执行用户的sql语句

DROP TABLE t1;
CREATE TABLE t1 (c1 INT, c2 int);
insert into t1 values(3,3);
insert into t1 values(4,4);
insert into t1 values(1,1);
insert into t1 values(2,2);DROP VIEW v_merge;
DROP VIEW v_merge2;-- 定义为 MERGE
CREATE ALGORITHM = MERGE VIEW v_merge (vc1, vc2) AS
SELECT c1, c2 FROM t1 WHERE c1 < 100 ORDER BY c1 DESC, c2 ASC;table v_merge;
select * from v_merge group by vc1;
+------+------+
| vc1  | vc2  |
+------+------+
|    3 |    3 |
|    4 |    4 |
|    1 |    1 |
|    2 |    2 |
+------+------+
4 rows in set (0.01 sec)-- 定义为 TEMPTABLE
CREATE ALGORITHM = TEMPTABLE VIEW v_merge2 (vc1, vc2) AS
SELECT c1, c2 FROM t1 WHERE c1 < 100 ORDER BY c1 DESC, c2 ASC;table v_merge2;
select * from v_merge2 group by vc1;
+------+------+
| vc1  | vc2  |
+------+------+
|    4 |    4 |
|    3 |    3 |
|    2 |    2 |
|    1 |    1 |
+------+------+
4 rows in set (0.01 sec)

修改视图

MySQL :: MySQL 8.0 Reference Manual :: 15.1.11 ALTER VIEW Statement

ALTER[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}][DEFINER = user][SQL SECURITY { DEFINER | INVOKER }]VIEW view_name [(column_list)]AS select_statement[WITH [CASCADED | LOCAL] CHECK OPTION]

select_stmt

  • 是一种 SELECT 语句。它给出了视图的定义。该语句可以从基表或其他视图进行选择。

column_name_list

  • 视图必须具有唯一的列名,不得有重复,就像基表那样。缺省情况下,由 SELECT 语句检索的列名将用作视图列名。
  • 要想为视图列定义明确的名称,可使用可选的 column_name_list 子句,列出由逗号隔开的 column_name。
  • column_name_list 中的名称数目必须等于 SELECT 语句检索的列数。
  • SELECT 语句检索的列可以是对表列的简单引用。也可以是使用函数、常量值、操作符等的表达式。

删除视图

当前用户必须在每个视图上有 DROP 权限。

MySQL :: MySQL 8.0 Reference Manual :: 15.1.35 DROP VIEW Statement

drop_view_stmt:DROP VIEW [IF EXISTS] view_name_list [CASCADE | RESTRICT];view_name_list:view_name [, view_name_list]

IF EXISTS

  • 使用 IF EXISTS 关键字可以防止由于视图不存在而出错。

view_name_list

  • 如果 view_name_list 中包含一部分存在和一部分不存在的视图,执行可能报错但是存在的视图依然会被删除。

CASCADE | RESTRICT

  • CASCADE 为级联删除,自动删除依赖此视图的对象。
  • RESTRICT 为约束删除,如果有依赖对象存在,则拒绝删除此视图。

DROP VIEW v1,v2;
DROP VIEW IF EXISTS v3,v4;

可更新和不可更新视图

MySQL :: MySQL 8.0 Reference Manual :: 27.5.3 Updatable and Insertable Views

https://www.cnblogs.com/zhuchenglin/p/9602569.html

要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。还有一些其他构造使视图不可更新。更具体地说,如果视图包含以下任何内容,则该视图不可更新:

  1. 聚合函数(SUM(), MIN(), MAX(), COUNT()等)。
  2. DISTINCT
  3. GROUP BY
  4. HAVING
  5. UNION 或 UNION ALL
  6. select 列表中的子查询 (原话:Subquery in the select list)
    • 选择列表中的非依赖子查询无法进行插入,但可以进行更新、删除。对于选择列表中的依赖子查询,不允许使用数据更改语句。
  1. Join 链接
  2. FROM子句中引用不可更新视图
  3. WHERE子句中引用FROM子句中表的子查询
  4. 仅引用文字值(在该情况下,没有要更新的基本表)。
  5. ALGORITHM = TEMPTABLE(使用临时表总会使视图成为不可更新的)。
  6. 对基表任意列的多次引用(插入会失败。更新/删除 均正常)

视图中生成的列被认为是可更新的,因为它可以指定给它。但是,如果显式更新了此类列,则唯一允许的值是默认值。

多表视图有时可能是可更新的,前提是可以使用合并算法(ALGORITHM = MERGE)进行处理。要使其工作,视图必须使用内部联接( inner join)(而不是外部联接或并集,not an outer join or a UNION)。此外,视图定义中只能更新一个表,因此SET子句只能命名视图中某个表中的列。不允许使用UNION ALL的视图,即使它们在理论上是可更新的。

INSERT

使用 INSERT 语句时,INSERT 语句中含有被合并的视图引用(视图联接视图的引用),如果是视图联接视图的引用(案例中的vjoin),则这个视图的所有组件必须都是可更新的(不是物化)。

对于多表组合成的可更新视图,INSERT 是可以正常插入该视图的其中一张表的。

CREATE TABLE t1 (x INTEGER);
CREATE TABLE t2 (c INTEGER);
CREATE VIEW vmat AS SELECT SUM(x) AS s FROM t1;
CREATE VIEW vup AS SELECT * FROM t2;
CREATE VIEW vjoin AS SELECT * FROM vmat JOIN vup ON vmat.s=vup.c;--此语句无效,因为联接视图的一个组件不可更新
INSERT INTO vjoin (c) VALUES (1);-- 本声明有效;该视图不包含物化组件
INSERT INTO vup (c) VALUES (1);

UPDATE

使用 UPDATE 语句更新的,有可能是被合并的一个或多个表的视图引用。如果更新的是一个视图联接视图,则必须保证联接视图中至少一个组件(其中一个视图)是可以更新的,这里跟 INSERT 不同。

一个多表更新语句,语句更新表引用的必须是基表或可更新视图的引用,不可更新表的引用可能是物化视图或者派生表。

CREATE TABLE t1 (x INTEGER);
CREATE TABLE t2 (c INTEGER);
CREATE VIEW vmat AS SELECT SUM(x) AS s FROM t1;
CREATE VIEW vup AS SELECT * FROM t2;
CREATE VIEW vjoin AS SELECT * FROM vmat JOIN vup ON vmat.s=vup.c;-- 本声明有效,列c来自联接视图的可更新部分:
UPDATE vjoin SET c=c+1;-- 本声明无效,列x来自不可更新的部分:
UPDATE vjoin SET x=x+1;-- 本声明有效,多表更新的更新表引用是一个可更新视图(vup):
UPDATE vup JOIN (SELECT SUM(x) AS s FROM t1) AS dt ON ...
SET c=c+1;-- 本声明无效,它尝试更新一个物化派生表:
UPDATE vup JOIN (SELECT SUM(x) AS s FROM t1) AS dt ON ...
SET s=s+1;

DELETE

单表或多表被 DELETE 语句删除,前提是必须是合并视图联接视图则不被允许(与 INSERT / UPDATE 不同)。

CREATE TABLE t1 (x INTEGER);
CREATE TABLE t2 (c INTEGER);
CREATE VIEW vmat AS SELECT SUM(x) AS s FROM t1;
CREATE VIEW vup AS SELECT * FROM t2;
CREATE VIEW vjoin AS SELECT * FROM vmat JOIN vup ON vmat.s=vup.c;--此语句无效,因为该视图是联接视图(the view is a join view):
DELETE FROM vjoin WHERE c=1;-- 此语句有效,因为该视图是一个被合并的(可更新)视图:
DELETE FROM vup WHERE c=2;-- 此语句有效,因为它从一个被合并的(可更新)视图中删除:
DELETE vup FROM vup JOIN (SELECT SUM(x) AS s FROM t1) AS dt ON dt.s=vup.c;

如果并非所有列都是简单列引用(例如,如果视图包含表达式或复合表达式的列),则视图不可插入。虽然这样的视图是不可插入的,但如果只更新非表达式的列,则它是可更新的。考虑以下观点:

CREATE VIEW v AS SELECT col1, 1 AS col2 FROM t;-- 可以更新
UPDATE v SET col1 = 0;-- 此视图不可插入,因为col2是一个表达式。
UPDATE v SET col2=0;

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

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

相关文章

【HTML】tabindex

当给 div 标签以 button 角色&#xff1a; <div role"button">这时要指定其 tabindex&#xff0c;因此正确的写法是&#xff1a; <div role"button" tabindex"0">索引值不应当大于0&#xff0c;见a11y-positive-tabindex

Open3D(C++) Ransac拟合多项式曲线

目录 一、算法原理一、代码实现三、结果展示本文由CSDN点云侠原创,Open3D(C++) Ransac拟合多项式曲线,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT生成的文章。 一、算法原理 RANSAC(Random Sample Consensus)是一种用于拟合模型的迭…

设计模式深度解析:分布式与中心化

设计模式在软件开发中扮演着至关重要的角色,它们提供了一套经过验证的解决方案,用于解决常见的设计问题。在分布式和中心化这两种不同的系统架构中,设计模式的应用也有所不同。以下是对这两种架构下设计模式的深度解析: 分布式系统设计模式 在分布式系统中,由于系统被拆…

004 仿muduo实现高性能服务器组件_Buffer模块与Socket模块的实现

​&#x1f308;个人主页&#xff1a;Fan_558 &#x1f525; 系列专栏&#xff1a;仿muduo &#x1f339;关注我&#x1f4aa;&#x1f3fb;带你学更多知识 文章目录 前言Buffer模块Socket模块 小结 前言 这章将会向你介绍仿muduo高性能服务器组件的buffer模块与socket模块的实…

【Leetcode 706 】设计哈希映射——数组嵌套链表(限制哈希Key)

题目 不使用任何内建的哈希表库设计一个哈希映射&#xff08;HashMap&#xff09;。 实现 MyHashMap 类&#xff1a; MyHashMap() 用空映射初始化对象void put(int key, int value) 向 HashMap 插入一个键值对 (key, value) 。如果 key 已经存在于映射中&#xff0c;则更新其…

MATLAB的plot3使用技巧|更改视角|例程分享链接

plot3命令 MATLAB的plot3函数是用来绘制3D图形的函数。它可以将三维数据可视化为线段、点、曲线等形式。plot3函数可以用于绘制三维空间中的曲线、曲面、散点图等。 plot3函数的基本用法是&#xff1a; plot3(X,Y,Z)&#xff1a;绘制三维线段&#xff0c;其中X、Y、Z分别是包…

两个双指针 的 “他“和“ 她“会相遇么? —— “双指针“算法 (Java版)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人能接…

MySQL入门学习-查询进阶.UNION

UNION操作符用于合并两个或多个SELECT语句的结果集。它可以将多个查询结果合并为一个结果集&#xff0c;这在需要从多个表中获取数据并将它们组合在一起时非常有用。下面是一个使用UNION的示例代码&#xff1a; SELECT column1, column2,...FROM table1UNIONSELECT column1, c…

springboot kafka 提高拉取数量

文章目录 背景问题复现解决问题原理分析fetch.min.bytesfetch.max.wait.ms源码分析ReplicaManager#fetchMessages 背景 开发过程中&#xff0c;使用kafka批量消费&#xff0c;发现拉取数量一直为1&#xff0c;如何提高批量拉取数量&#xff0c;记录下踩坑记录。 问题复现 ka…

攻防对抗少丢分,爱加密帮您筑起第二防线

应用程序通常处理和存储大量的敏感数据&#xff0c;如用户个人信息、财务信息、商业数据、国家数据等&#xff0c;用户量越大的应用程序&#xff0c;其需要存储和保护的用户数据越多。因此应用层长期是攻击方的核心目标&#xff0c;传统应用安全依靠防火墙(FireWall)、入侵检测…

1.7 协议层次和服务模型

协议层次 网络是一个复杂的系统!  网络功能繁杂&#xff1a;数字信号的物理信 号承载、点到点、路由、rdt、进程区分、应用等 现实来看&#xff0c;网络的许多构成元素和设备:  主机  路由器  各种媒体的链路  应用  协议  硬件, 软件 Q:如何组织和实现这个…

Linux上实现ssh免密通讯

Linux上实现ssh免密通讯 1.SSH互信原理2.SSH所需的RPM包3.两台机器实现互信4.常见问题及处理 1.SSH互信原理 SSH&#xff08;Secure Shell&#xff09;是一种安全的传输协议&#xff0c;它能让Linux系统中的服务器和客户端之间进行安全可靠的通讯。 SSH使用加密的传输方式&…

iOS组件化 方案 实现

iOS组件化 组件化的原因现在流行的组件化方案方案一、url-block &#xff08;基于 URL Router&#xff09;方案二、protocol调用方式解读 方案三、target-action调用方式解读 gitHub代码链接参考 组件化的原因 模块间解耦模块重用提高团队协作开发效率单元测试 当项目App处于…

网络原理-四

一、续 当窗口大小为0,意味着缓冲区满了,此时发送方,就因该暂停发送,发送方会周期性的除法 " 窗口探测包 " ,并不携带载荷,这样的包对于业务不产生影响,只是为了触发ACK,一旦查询出来的结果是非0,缓冲区右有空间了,发送方就可以继续发送. 二、拥塞控制 要限制发送方…

一步一步写线程之十三队列间的消息通知

一、线程和分布式的通信 随着技术的不断发展&#xff0c;多线程和分布式通信愈发的普及。那么在这种场景下的如何进行数据的通信&#xff0c;便成为了一个非常典型的问题。无论是多线程还是分布式&#xff0c;其实其抽象出来的通信机制都是类似的。或者说换句话&#xff0c;多…

java检测字符串是否包含数字和字母

在Java中&#xff0c;要检测一个字符串是否同时包含数字和字母&#xff0c;我们可以使用正则表达式&#xff08;regex&#xff09;或者通过遍历字符串并检查每个字符来实现。以下是两种方法的详细代码示例&#xff1a; 1.方法一&#xff1a;使用正则表达式 import java.util.…

【AI+知识库问答】沉浸式体验了解 AI知识库问答fastGPT

之前写过一篇文章 【AI本地知识库】个人整理的几种常见本地知识库技术方案 &#xff0c; 由于当时主要是针对AI本地知识库&#xff0c; 所以没列fastGPT。 最近经常刷到fastGPT&#xff0c;这里单独水一篇。 FastGPT 是一个基于 LLM 大语言模型的知识库问答系统&#xff0c;…

Github 2024-06-01 开源项目日报Top10

根据Github Trendings的统计,今日(2024-06-01统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目5Jupyter Notebook项目2TypeScript项目1Go项目1Shell项目1Lua项目1Kong:云原生API网关与AI能力 创建周期:3482 天开发语言:Lua协议…

如何确保绩效目标执行到位?

很多企业在实施绩效过程中&#xff0c;尽管制定好了绩效目标&#xff0c;但是没有执行下去&#xff0c;管理者将原因归咎于“员工低效”、“体制机制”等问题&#xff0c;那么在人力资源管理方面&#xff0c;企业应该如何确保制定的绩效目标执行到位&#xff1f;如何提高低效能…

云原生架构相关技术_4.服务网格

1.技术特点 服务网格&#xff08;ServiceMesh&#xff09;是分布式应用在微服务软件架构之上发展起来的新技术&#xff0c;旨在将那些微服务间的连接、安全、流量控制和可观测等通用功能下沉为平台基础设施&#xff0c;实现应用与平台基础设施的解耦。这个解耦意味着开发者无需…