合 PG中的视图
简介
View(视图)是一张假表,只不过是通过相关的名称存储在数据库中的一个 PostgreSQL 语句。
View(视图)实际上是一个以预定义的 PostgreSQL 查询形式存在的表的组合。
View(视图)可以包含一个表的所有行或从一个或多个表选定行。
View(视图)可以从一个或多个表创建,这取决于要创建视图的 PostgreSQL 查询。
View(视图)是一种虚拟表,允许用户实现以下几点:
- 用户或用户组认为更自然或直观查找结构数据的方式。
- 限制数据访问,用户只能看到有限的数据,而不是完整的表。
- 汇总各种表中的数据,用于生成报告。
PostgreSQL 视图是只读的,因此可能无法在视图上执行 DELETE、INSERT 或 UPDATE 语句。但是可以在视图上创建一个触发器,当尝试 DELETE、INSERT 或 UPDATE 视图时触发,需要做的动作在触发器内容中定义。
CREATE VIEW(创建视图)
在 PostgreSQL 用 CREATE VIEW 语句创建视图,视图创建可以从一张表,多张表或者其他视图。
CREATE VIEW 基础语法如下:
1 2 3 4 | CREATE [TEMP | TEMPORARY] VIEW view_name AS SELECT column1, column2..... FROM table_name WHERE [condition]; |
您可以在 SELECT 语句中包含多个表,这与在正常的 SQL SELECT 查询中的方式非常相似。如果使用了可选的 TEMP 或 TEMPORARY 关键字,则将在临时数据库中创建视图。
实例
创建 COMPANY 表,数据内容如下:
1 2 3 4 5 6 7 8 9 10 11 | lhrpgdb# select * from COMPANY; id | name | age | address | salary ----+-------+-----+-----------+--------- 1 | Paul | 32 | California| 20000 2 | Allen | 25 | Texas | 15000 3 | Teddy | 23 | Norway | 20000 4 | Mark | 25 | Rich-Mond | 65000 5 | David | 27 | Texas | 85000 6 | Kim | 22 | South-Hall| 45000 7 | James | 24 | Houston | 10000 (7 rows) |
现在,下面是一个从 COMPANY 表创建视图的实例。视图只从 COMPANY 表中选取几列:
1 2 3 | lhrpgdb=# CREATE VIEW COMPANY_VIEW AS SELECT ID, NAME, AGE FROM COMPANY; |
现在,可以查询 COMPANY_VIEW,与查询实际表的方式类似。下面是实例:
1 | lhrpgdb# SELECT * FROM COMPANY_VIEW; |
得到结果如下:
1 2 3 4 5 6 7 8 9 10 | id | name | age ----+-------+----- 1 | Paul | 32 2 | Allen | 25 3 | Teddy | 23 4 | Mark | 25 5 | David | 27 6 | Kim | 22 7 | James | 24 (7 rows) |
DROP VIEW (删除视图)
要删除视图,只需使用带有 view_name 的 DROP VIEW 语句。DROP VIEW 的基本语法如下:
1 | lhrpgdb=# DROP VIEW view_name; |
下面的命令将删除我们在前面创建的 COMPANY_VIEW 视图:
1 | lhrpgdb=# DROP VIEW COMPANY_VIEW; |
PG中的临时视图
与oracle不同,pg可以创建临时视图
1 | create temp view vw_class as select * from pg_class; |
创建完后,在别的会话中是无法查看该视图的,这个会话退出后,这个视图的定义也被清除掉了
可更新视图
从PG 9.3开始,创建的简单视图,默认是可以更新的。如果是老版本,那么可以通过定义一个规则来更新视图。
1 2 3 4 5 | create table test as select * from pg_class; create view v_test as select * from test; select * from v_test; |
需要创建规则来使视图可更新
1 | create or replace rule r_test as on update to v_test do instead update test set relname=new.relname where relnamespace=new.relnamespace; |
同理插入,删除都需要创建规则
删除
1 | create rule vm_del as on delete to vw_test do instead delete from test where id=old.id; |
视图和规则系统
http://postgres.cn/docs/13/rules-views.html
PostgreSQL中的视图是通过规则系统来实现的。事实上,下面的命令
1 | CREATE VIEW myview AS SELECT * FROM mytab; |
与下面两个命令相比没有不同:
1 2 3 | CREATE TABLE myview (same column list as mytab); CREATE RULE "_RETURN" AS ON SELECT TO myview DO INSTEAD SELECT * FROM mytab; |
因为这就是CREATE VIEW
命令在内部所作的。 这样做有一些副作用。其中之一就是在PostgreSQL系统目录中的视图信息与表的信息完全一样。所以对于解析器来说,表和视图之间完全没有区别。它们是同样的事物:关系。
1. SELECT规则如何工作
规则ON SELECT
被应用于所有查询作为最后一步,即使给出的是一条INSERT
、UPDATE
或DELETE
命令。而且它们与其他命令类型上的规则有着不同的语义,它们会就地修改查询树而不是创建一个新的查询树。因此我们首先描述SELECT
规则。
目前,一个ON SELECT
规则中只能有一个动作, 而且它必须是一个无条件的INSTEAD
的SELECT
动作。 这个限制是为了令规则足够安全,以便普通用户也可以打开它们,并且它限制ON SELECT
规则使之行为类似视图。
本章的例子是两个连接视图,它们做一些运算并且某些更多视图会轮流使用它们。最前面的两个视图之一后面将利用对INSERT
、UPDATE
和DELETE
操作增加规则的方法被自定义,这样最终结果将是一个视图,它表现得像一个具有魔力的真正的表。这个例子不适合于作为简单易懂的例子,它可能会让本章更难懂。但是用一个覆盖所有关键点的例子来一步一步讨论要比举很多例子搞乱思维好。
在前两个规则系统描述中我们需要真实表是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | CREATE TABLE shoe_data ( shoename text, -- 主键 sh_avail integer, -- 可用的双数 slcolor text, -- 首选的鞋带颜色 slminlen real, -- 最小鞋带长度 slmaxlen real, -- 最大鞋带长度 slunit text -- 长度单位 ); CREATE TABLE shoelace_data ( sl_name text, -- 主键 sl_avail integer, -- 可用的双数 sl_color text, -- 鞋带颜色 sl_len real, -- 鞋带长度 sl_unit text -- 长度单位 ); CREATE TABLE unit ( un_name text, -- 主键 un_fact real -- 转换到厘米的参数 ); |
如你所见,它们表示鞋店的数据。
视图被创建为: