PostgreSql 视图
一、概述
视图(View)本质上是一个存储在数据库中的查询语句。视图本身不包含数据,也被称为虚拟表。 我们在创建视图时给它指定了一个名称,然后可以像表一样对其进行查询。
优势:
- 不保存数据,节省空间。
- 减少频繁调用 sql 的重复书写。
- 可控制数据访问,隐藏不想对外展示的数据。
劣势:
- 可能增加数据库压力,严重时会妨碍整个数据库的运行。(常见于复杂视图)
二、语法
2.1 创建视图
CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] [ RECURSIVE ] VIEW name [ ( column_name [, ...] ) ][ WITH ( view_option_name [= view_option_value] [, ... ] ) ]AS query[ WITH [ CASCADED | LOCAL ] CHECK OPTION ]
CREATE VIEW:定义一个查询的视图。
CREATE OR REPLACE VIEW:如果已经存在一个同名视图,该视图会被替换(限制:只能在原视图基础上增加字段,不能减少字段,且增加字段顺序只能排在最后)。
TEMPORARY|TEMP:视图被创建为一个临时视图。在当前会话结束时会自动删掉。当临时视图存在时,具有相同名称的已有永久视图对当前会话不可见,除非用模式限定的名称引用它们。如果视图引用的任何表是临时的,视图将被创建为临时视图(不管有没有指定TEMPORARY)。
RECURSIVE:创建一个递归视图。
name:要创建的视图的名字(可以是模式限定的)。
column_name:要用于视图列的名称列表,可选。如果没有给出,列名会根据查询推导。
WITH ( view_option_name [= view_option_value] [, … ] ):这个子句为视图指定一些可选的参数,支持下列参数:check_option (enum):这个参数可以是 local 或者cascaded,并且它等效于指定 WITH [ CASCADED | LOCAL ] CHECK OPTION(见下文)。 可以使用 ALTER VIEW 在一个现有视图上修改这个选项。
security_barrier (boolean):如果希望视图提供行级安全性,应该使用这个参数。
query:提供视图的行和列的一个 SELECT 或者 VALUES 命令。
WITH [ CASCADED | LOCAL ] CHECK OPTION:这个选项控制自动可更新视图的行为。这个选项被指定时,将检查该视图上的 INSERT 和UPDATE 命令以确保新行满足视图的定义条件(也就是,将检查新行来确保通过视图能看到它们)。如果新行不满足条件,更新将被拒绝。如果没有指定 CHECK OPTION,会允许该视图上的 INSERT 和 UPDATE 命令创建通过该视图不可见的行。支持下列检查选项:LOCAL:只根据直接定义在该视图本身的条件检查新行。任何定义在底层基视图上的 条件都不会被检查(除非它们也指定了CHECK OPTION)。
CASCADED:会根据该视图和所有底层基视图上的条件检查新行。如果 CHECK OPTION 被指定,并且没有指定 LOCAL 和 CASCADED,则会假定为 CASCADED。 CHECK OPTION 不应该和 RECURSIVE视图一起使用。注意,只有在自动可更新的、没有 NSTEAD OF 触发器或者 INSTEAD 规则的视图上才支持 CHECK OPTION。 如果一个自动可更新的视图被定义在一个具有 INSTEAD OF 触发器的基视图之上,那么 LOCAL CHECK OPTION 可以被用来检查该自动可更新的视图之上的条件,但具有 INSTEAD OF 触发器的基视图上的条件不会被检查(一个级联检查选项将不会级联到一个 触发器可更新的视图,并且任何直接定义在一个触发器可更新视图上的检查 选项将被忽略)。如果该视图或者任何基础关系具有导致 INSERT 或 UPDATE 命令被重写的 INSTEAD 规则,那么在被重写的查询中将忽略所有检查选项,包括任何来自于定义在带有 INSTEAD 规则的关系之上的自动可更新视图的检查。
2.2 修改视图
ALTER VIEW [ IF EXISTS ] name ALTER [ COLUMN ] column_name SET DEFAULT expression
ALTER VIEW [ IF EXISTS ] name ALTER [ COLUMN ] column_name DROP DEFAULT
ALTER VIEW [ IF EXISTS ] name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }
ALTER VIEW [ IF EXISTS ] name RENAME TO new_name
ALTER VIEW [ IF EXISTS ] name SET SCHEMA new_schema
ALTER VIEW [ IF EXISTS ] name SET ( view_option_name [= view_option_value] [, ... ] )
ALTER VIEW [ IF EXISTS ] name RESET ( view_option_name [, ... ] )
name:一个现有视图的名称(可以是模式限定的)。
column_name:现有列的名称。
new_column_name:现有列的新名称。
IF EXISTS:该视图不存在时不要抛出一个错误。这种情况下会发出一个提示。
SET/DROP DEFAULT:这些形式为一个列设置或者移除默认值。对于任何在该视图上的 INSERT 或者 UPDATE 命令,一个视图列的默认值会在引用该视图的任何规则或触发器之前被替换进来。因此,该视图的默认值将会优先于来自底层关系的任何默认值。
new_owner:该视图的新拥有者的用户名。
new_name:该视图的新名称。
new_schema:该视图的新模式。
SET ( view_option_name [= view_option_value] [, … ] )/RESET ( view_option_name [, … ] ):设置或者重置一个视图选项。当前支持的选项有:check_option (enum):更改该视图的检查选项。值必须是 local 或者 cascaded。
security_barrier (boolean):更改该视图的安全屏障属性。值必须是一个布尔值,如 true 或者 false。
2.3 删除视图
DROP VIEW [ IF EXISTS ] name [, ...] [ CASCADE | RESTRICT ]
IF EXISTS:如果该视图不存在则不要抛出一个错误,而是发出一个提示。
name:要移除的视图的名称(可以是模式限定的)。
CASCADE:自动删除依赖于该视图的对象(例如其他视图),然后删除所有依赖于那些对象的对象。
RESTRICT:如果有任何对象依赖于该视图,则拒绝删除它。这是默认值。
三、示例
3.1 创建视图
--用下列三张基表构建包含员工姓名,工作,部门,隐藏薪资的视图
postgres=# select * from emp;employee_id | first_name | last_name | email | phone_number | hire_date | job_id | salary | commission_pct | manager_id | department_id
-------------+------------+-----------+----------+--------------+------------+------------+----------+----------------+------------+---------------100 | Steven | King | SKING | 515.123.4567 | 2003-06-17 | AD_PRES | 24000.00 | | | 90101 | Neena | Kochhar | NKOCHHAR | 515.123.4568 | 2005-09-21 | AD_VP | 17000.00 | | 100 | 90102 | Lex | De Haan | LDEHAAN | 515.123.4569 | 2001-01-13 | AD_VP | 17000.00 | | 100 | 90103 | Alexander | Hunold | AHUNOLD | 590.423.4567 | 2006-01-03 | IT_PROG | 9000.00 | | 102 | 60104 | Bruce | Ernst | BERNST | 590.423.4568 | 2007-05-21 | IT_PROG | 6000.00 | | 103 | 60105 | David | Austin | DAUSTIN | 590.423.4569 | 2005-06-25 | IT_PROG | 4800.00 | | 103 | 60106 | Valli | Pataballa | VPATABAL | 590.423.4560 | 2006-02-05 | IT_PROG | 4800.00 | | 103 | 60107 | Diana | Lorentz | DLORENTZ | 590.423.5567 | 2007-02-07 | IT_PROG | 4200.00 | | 103 | 60108 | Nancy | Greenberg | NGREENBE | 515.124.4569 | 2002-08-17 | FI_MGR | 12008.00 | | 101 | 100109 | Daniel | Faviet | DFAVIET | 515.124.4169 | 2002-08-16 | FI_ACCOUNT | 9000.00 | | 108 | 100
(10 rows)postgres=# select * from jobs;job_id | job_title | min_salary | max_salary
------------+---------------------------------+------------+------------AD_PRES | President | 20080 | 40000AD_VP | Administration Vice President | 15000 | 30000AD_ASST | Administration Assistant | 3000 | 6000FI_MGR | Finance Manager | 8200 | 16000FI_ACCOUNT | Accountant | 4200 | 9000AC_MGR | Accounting Manager | 8200 | 16000AC_ACCOUNT | Public Accountant | 4200 | 9000SA_MAN | Sales Manager | 10000 | 20080SA_REP | Sales Representative | 6000 | 12008PU_MAN | Purchasing Manager | 8000 | 15000PU_CLERK | Purchasing Clerk | 2500 | 5500ST_MAN | Stock Manager | 5500 | 8500ST_CLERK | Stock Clerk | 2008 | 5000SH_CLERK | Shipping Clerk | 2500 | 5500IT_PROG | Programmer | 4000 | 10000MK_MAN | Marketing Manager | 9000 | 15000MK_REP | Marketing Representative | 4000 | 9000HR_REP | Human Resources Representative | 4000 | 9000PR_REP | Public Relations Representative | 4500 | 10500
(19 rows)postgres=# select * from dept;department_id | department_name
---------------+-----------------1 | Adminstration2 | Marketing30 | Purchasing
(3 rows)--构建视图
postgres=# create or replace view emp_details_view
postgres-# as select
postgres-# e.employee_id,
postgres-# e.job_id,
postgres-# e.department_id,
postgres-# e.first_name,
postgres-# e.last_name,
postgres-# d.department_name,
postgres-# j.job_title
postgres-# from emp e
postgres-# join departments d on (e.department_id = d.department_id)
postgres-# join jobs j on (j.job_id = e.job_id);
CREATE VIEW
postgres=# select * from emp_details_view;employee_id | job_id | department_id | first_name | last_name | department_name | job_title
-------------+------------+---------------+------------+-----------+-----------------+-------------------------------100 | AD_PRES | 90 | Steven | King | Executive | President101 | AD_VP | 90 | Neena | Kochhar | Executive | Administration Vice President102 | AD_VP | 90 | Lex | De Haan | Executive | Administration Vice President103 | IT_PROG | 60 | Alexander | Hunold | IT | Programmer104 | IT_PROG | 60 | Bruce | Ernst | IT | Programmer105 | IT_PROG | 60 | David | Austin | IT | Programmer106 | IT_PROG | 60 | Valli | Pataballa | IT | Programmer107 | IT_PROG | 60 | Diana | Lorentz | IT | Programmer108 | FI_MGR | 100 | Nancy | Greenberg | Finance | Finance Manager109 | FI_ACCOUNT | 100 | Daniel | Faviet | Finance | Accountant
(10 rows)
3.2 修改视图
--增加入职时间字段(字段顺序只能排在原视图末尾。其他修改原视图字段的操作,只能删除视图重新创建)
postgres=# create or replace view emp_details_view
postgres-# as select
postgres-# e.employee_id,
postgres-# e.job_id,
postgres-# e.department_id,
postgres-# e.first_name,
postgres-# e.last_name,
postgres-# d.department_name,
postgres-# j.job_title,
postgres-# e.hire_date
postgres-# from emp e
postgres-# join departments d on (e.department_id = d.department_id)
postgres-# join jobs j on (j.job_id = e.job_id);
CREATE VIEW
postgres=# select * from emp_details_view;employee_id | job_id | department_id | first_name | last_name | department_name | job_title | hire_date
-------------+------------+---------------+------------+-----------+-----------------+-------------------------------+------------100 | AD_PRES | 90 | Steven | King | Executive | President | 2003-06-17101 | AD_VP | 90 | Neena | Kochhar | Executive | Administration Vice President | 2005-09-21102 | AD_VP | 90 | Lex | De Haan | Executive | Administration Vice President | 2001-01-13103 | IT_PROG | 60 | Alexander | Hunold | IT | Programmer | 2006-01-03104 | IT_PROG | 60 | Bruce | Ernst | IT | Programmer | 2007-05-21105 | IT_PROG | 60 | David | Austin | IT | Programmer | 2005-06-25106 | IT_PROG | 60 | Valli | Pataballa | IT | Programmer | 2006-02-05107 | IT_PROG | 60 | Diana | Lorentz | IT | Programmer | 2007-02-07108 | FI_MGR | 100 | Nancy | Greenberg | Finance | Finance Manager | 2002-08-17109 | FI_ACCOUNT | 100 | Daniel | Faviet | Finance | Accountant | 2002-08-16
(10 rows)--修改视图名
postgres=# \dvList of relationsSchema | Name | Type | Owner
--------+------------------+------+----------public | emp_details_view | view | postgres
(1 row)postgres=# alter view if exists emp_details_view rename to emp_view;
ALTER VIEW
postgres=# \dvList of relationsSchema | Name | Type | Owner
--------+----------+------+----------public | emp_view | view | postgres
(1 row)--由于历史原因,ALTER TABLE 也可以用于视图
postgres=# alter table if exists emp_view rename to emp_view2;
ALTER TABLE
postgres=# \dvList of relationsSchema | Name | Type | Owner
--------+-----------+------+----------public | emp_view2 | view | postgres
(1 row)
3.3 删除视图
postgres=# drop view emp_view2;
DROP VIEW
四、可更新视图
如果一个视图满足以下条件,它就是自动可更新的:
- 在该视图的 FROM 列表中刚好只有一项,并且它必须是一个表或者另一个可更新视图。
- 视图定义的顶层不能包含 WITH、DISTINCT、GROUP BY、HAVING、LIMIT 或者 OFFSET 子句。
- 视图定义的顶层不能包含集合操作(UNION、 INTERSECT 或者 EXCEPT)。
- 视图的选择列表不能包含任何聚集、窗口函数或者集合返回函数。
一个更加复杂的不满足所有这些条件的视图默认是只读的:系统将不允许在该视图上的插入、更新或者删除。可以通过在该视图上创建一个 INSTEAD OF 触发器来获得可更新视图的效果,该触发器必须把该视图上的尝试的插入等转换成其他表上合适的动作。
4.1 创建可更新视图
postgres=# create or replace view employees_it as
postgres-# select employee_id,
postgres-# first_name,
postgres-# last_name,
postgres-# email,
postgres-# phone_number,
postgres-# hire_date,
postgres-# job_id,manager_id,
postgres-# department_id
postgres-# from employees where department_id = 60;
CREATE VIEW
postgres=# select * from employees_it;employee_id | first_name | last_name | email | phone_number | hire_date | job_id | manager_id | department_id
-------------+------------+-----------+----------+--------------+------------+---------+------------+---------------103 | Alexander | Hunold | AHUNOLD | 590.423.4567 | 2006-01-03 | IT_PROG | 102 | 60104 | Bruce | Ernst | BERNST | 590.423.4568 | 2007-05-21 | IT_PROG | 103 | 60105 | David | Austin | DAUSTIN | 590.423.4569 | 2005-06-25 | IT_PROG | 103 | 60106 | Valli | Pataballa | VPATABAL | 590.423.4560 | 2006-02-05 | IT_PROG | 103 | 60107 | Diana | Lorentz | DLORENTZ | 590.423.5567 | 2007-02-07 | IT_PROG | 103 | 60
(5 rows)postgres=# insert into employees_it(employee_id, first_name, last_name, email, phone_number, hire_date, job_id,manager_id,department_id)values(207,'Tony','Dong','DONG','590.423.5568','2020-05-06','IT_PROG',
postgres(# 103,60);
INSERT 0 1
postgres=# select * from employees_it;employee_id | first_name | last_name | email | phone_number | hire_date | job_id | manager_id | department_id
-------------+------------+-----------+----------+--------------+------------+---------+------------+---------------103 | Alexander | Hunold | AHUNOLD | 590.423.4567 | 2006-01-03 | IT_PROG | 102 | 60104 | Bruce | Ernst | BERNST | 590.423.4568 | 2007-05-21 | IT_PROG | 103 | 60105 | David | Austin | DAUSTIN | 590.423.4569 | 2005-06-25 | IT_PROG | 103 | 60106 | Valli | Pataballa | VPATABAL | 590.423.4560 | 2006-02-05 | IT_PROG | 103 | 60107 | Diana | Lorentz | DLORENTZ | 590.423.5567 | 2007-02-07 | IT_PROG | 103 | 60207 | Tony | Dong | DONG | 590.423.5568 | 2020-05-06 | IT_PROG | 103 | 60
(6 rows)
4.2 可更新视图数据“丢失”问题
--视图为部门 id 为 60 的数据,部门 id 为 80 的数据可插入成功,但查询不到
postgres=# insert into employees_it(employee_id, first_name, last_name, email, phone_number, hire_date, job_id,manager_id,department_id)values(2000,'Tony','ong','ong','590.423.5568','2020-05-06','IT_PROG',
103,80);
INSERT 0 1
postgres=# select * from employees_it;employee_id | first_name | last_name | email | phone_number | hire_date | job_id | manager_id | department_id
-------------+------------+-----------+----------+--------------+------------+---------+------------+---------------103 | Alexander | Hunold | AHUNOLD | 590.423.4567 | 2006-01-03 | IT_PROG | 102 | 60104 | Bruce | Ernst | BERNST | 590.423.4568 | 2007-05-21 | IT_PROG | 103 | 60105 | David | Austin | DAUSTIN | 590.423.4569 | 2005-06-25 | IT_PROG | 103 | 60106 | Valli | Pataballa | VPATABAL | 590.423.4560 | 2006-02-05 | IT_PROG | 103 | 60107 | Diana | Lorentz | DLORENTZ | 590.423.5567 | 2007-02-07 | IT_PROG | 103 | 60207 | Tony | Dong | DONG | 590.423.5568 | 2020-05-06 | IT_PROG | 103 | 60
(6 rows)
4.3 约束检查避免数据“丢失”
--方式一:创建视图时带约束检查
postgres=# create or replace view employees_it as
postgres-# select employee_id,
postgres-# first_name,
postgres-# last_name,
postgres-# email,
postgres-# phone_number,
postgres-# hire_date,
postgres-# job_id,manager_id,
postgres-# department_id
postgres-# from employees
postgres-# where department_id = 60
postgres-# with check option;
CREATE VIEW--方式二:创建视图后,修改视图增加约束检查
postgres=# alter view if exists employees_it set(check_option = local(employee_id = 60));
ALTER VIEW--增加检查约束后,视图中不允许插入超出约束范围的数据
postgres=# insert into employees_it(employee_id, first_name, last_name, email, phone_number, hire_date, job_id,manager_id,department_id)values(2000,'Tony','ong','ong','590.423.5568','2020-05-06','IT_PROG',
103,80);
ERROR: new row violates check option for view "employees_it"
DETAIL: Failing row contains (2000, Tony, ong, ong, 590.423.5568, 2020-05-06, IT_PROG, null, null, 103, 80).
相关文章:
PostgreSql 视图
一、概述 视图(View)本质上是一个存储在数据库中的查询语句。视图本身不包含数据,也被称为虚拟表。 我们在创建视图时给它指定了一个名称,然后可以像表一样对其进行查询。 优势: 不保存数据,节省空间。减少…...
【PAT甲级题解记录】1150 Travelling Salesman Problem (25 分)
【PAT甲级题解记录】1150 Travelling Salesman Problem (25 分) 前言 Problem:1150 Travelling Salesman Problem (25 分) Tags:模拟 图的遍历 旅行商问题 Difficulty:剧情模式 想流点汗 想流点血 死而无憾 Address:1150 Travell…...
vue生命周期
vue生命周期是什么?Vue生命周期是指vue实例对象从创建之初到销毁的过程,vue所有功能的实现都是围绕其生命周期进行的,在生命周期的不同阶段调用对应的钩子函数可以实现组件数据管理和DOM渲染两大重要功能。我们来看一下官网给的vue生命周期的…...
排查解决Java进程占用内存过高
排查解决Java进程占用内存过高1 在项目部署运行之前1 检查JVM参数设置2 检查代码逻辑3 使用内存分析工具4 检查线程5 调整应用程序的设计7 调整硬件资源2 在项目部署运行之后1 在项目部署运行之前 1 检查JVM参数设置 检查JVM的启动参数设置,包括-Xmx和-Xms参数&am…...
一个基于 LKM 的 Linux 内核级 rootkit 的实现
博客已迁移至:https://gls.show/ GitHub链接 演示Slides overview rootkit是一种恶意软件,攻击者可以在获得 root 或管理员权限后安装它,从而隐藏入侵并保持root权限访问。rootkit可以是用户级的,也可以是内核级的。关于rootk…...
CAN工具 - ValueCAN - 基础介绍(续)
VSpy3(Vehicle Spy 3的简写),作为一个常用的车载总线仿真工具,在车载网络领域也是有非常大的市场,前面也简单介绍过一些简单的功能,今天就再次介绍一些。什么是VSpy3?VSpy3是美国英特佩斯公司下…...
一个Laravel+vue免费开源的基于RABC控制的博客系统
项目介绍 CCENOTE 是一个使用 Vue3 Laravel8 开发的前后端分离的基于RABC权限控制管理的内容管理系统,由于作者本人比较喜欢写作的原因,因此开发了这个项目,后端使用的PHP的Laravel框架,并且整理了数据层与业务层,相…...
从 B 站出发,用 Chrome devTools performance 分析页面如何渲染
页面是如何渲染的?通常会得到“解析 HTML、css 合成 Render Tree,就可以渲染了”的回答。但是具体都做了些什么,却很少有人细说,我们今天就从 Chrome 的性能工具开始,具体看看一个页面是如何进行渲染的,以及…...
Java异常Throwable的分类
1. Exception:程序本身可以捕获并且可以处理的异常 编译时异常:编译期就会检查的异常,若调用的方法中throw了此类异常,则必须进行显式处理处理(用try…catch捕获或者throws向上抛出),否则无法通…...
【mybatis的#和$使用和区别】
MyBatis是一种基于Java的持久层框架,用于将数据库操作和Java对象之间的映射进行处理。在MyBatis中,#和 $ 符号是用于SQL语句中的占位符。 在SQL语句中,#和 $ 符号都表示占位符,但它们的使用方式略有不同: # 符号 #符…...
感知趋势,洞察发展:2023(第十届)趋势与预测大会成功举办
2023年2月23日,运联年会:2023(第十届)趋势与预测大会在深圳机场凯悦酒店成功闭幕。自2014年开始,“运联年会:趋势与预测”已经连续举办九届。这场大会,既是一次行业性的“年终总结”,…...
Spring-Aop核心技术
前言spring一直以来都是我们Java开发中最核心的一个技术,其中又以ioc和aop为主要技术,本篇文章主要讲一下aop的核心技术,也就是ProxyFactory技术的使用,而基本的jdk动态代理和cglib代理技术并不涉及,如有需要ÿ…...
webpack常用优化原理剖析
webpack常用优化原理剖析 按需加载代码配置原理CDN加速-externals代码配置GZIP压缩代码配置原理Tree Shaking代码配置原理按需加载 把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件. 代码配置 //定义了一个异步函数,由于函数不调用不执行,所…...
【现在努力还不晚】--MySQL数据库的数据模型
目录 1、关系型数据库(RDBMS) 特点 2、数据模型 在学习MySQL之前要了解一下数据库的数据模型,我们就知道在MySQL当中,数据是如何存储的,我们了解一下概念! 1、关系型数据库(RDBMS࿰…...
二手商品交易网站
技术:Java、JSP等摘要:随着科学技术和信息通讯的飞速发展,Internet极大地丰富和改变着我们生活的各个行业。随着Internet的普及应用,人们可以跨越时间和空间的限制,足不出户便能通过网络完成信息交流,而完成…...
第三阶段04-同步请求和异步请求,get/post,Josn,pojo,Session/Cookie,过滤器Filter
文章目录同步请求和异步请求客户端如何发出异步请求自定义模板代码Get和Post请求异步版本的注册和登录商品管理系统(异步版本)商品列表步骤:前后端分离为什么需要前后端分离?为什么以后不再使用同步请求?JSONPOJO会话对象Session如何记住登录状态后端的MVC会话管理Cookie通过…...
Spark学习:spark相似算子解析
spark算子 一、Map、Flatmap和MapPartition二、repartition和coalesce三、reduceByKey和groupByKey四、collect、take和first一、Map、Flatmap和MapPartition 算子作用map接收一个高阶函数f,对每个算子进行f操作flatmap接收一个高阶函数f,对每个元素进行f操作,形成一个大的集合…...
MySQL操作数据表-----------创建数据表(一)
在MySQL中创建数据库完成后,需要使用USE 数据库名的形式指定进行操作的数据库,然后再去执行创建数据表的SQL语句,也可以直接使用数据库名.数据表名的形式创建数据表。 1.创建空数据表 语法格式:CREATE TABLE [IF EXISTS] 表名 &…...
Java “框架 = 注解 + 反射 + 设计模式” 之 注解详解
Java ”框架 注解 反射 设计模式“ 之 注解详解 每博一文案 刹那间我真想令时光停住,好让我回顾自己,回顾失去的年华,缅怀哪个穿一身短小的连衣裙 和瘦窄的短衫的小女孩。让我追悔少年时代,我心灵的愚钝无知,它轻易…...
特斯拉4D雷达方案首次曝光!高阶智驾市场比拼安全冗余
随着L2级智能驾驶进入普及阶段,L3/L4级赛道正在成为各家车企的下一个竞争焦点。背后的最大难题,就是如何在成本可控的前提下,保证足够的安全。 高工智能汽车研究院监测数据显示,2022年度中国市场(不含进出口ÿ…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
