# 创建视图
CREATE VIEW — 定义一个新视图
# 概要
CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] [ RECURSIVE ] VIEW name [ ( column_name [, ...] ) ]
[ WITH ( view_option_name [= view_option_value] [, ... ] ) ]
AS query
[ WITH [ CASCADED | LOCAL ] CHECK OPTION ]
# 描述
创建视图
定义查询的视图。该视图没有物理具体化。相反,每次在查询中引用视图时都会运行查询。
创建或替换视图
是相似的,但如果同名的视图已经存在,它会被替换。新查询必须生成与现有视图查询相同的列(即,相同的列名以相同的顺序和相同的数据类型),但它可能会在列表末尾添加其他列。产生输出列的计算可能完全不同。
如果给出了模式名称(例如,创建视图 myschema.myview ...
) 然后在指定的模式中创建视图。否则,它会在当前模式中创建。临时视图存在于一个特殊的模式中,因此在创建临时视图时不能给出模式名称。视图的名称必须与同一模式中的任何其他视图、表、序列、索引或外部表的名称不同。
# 参数
暂时的
要么温度
如果指定,则将视图创建为临时视图。在当前会话结束时会自动删除临时视图。当临时视图存在时,具有相同名称的现有永久关系对当前会话不可见,除非它们被模式限定名称引用。
如果视图引用的任何表是临时的,则视图被创建为临时视图(无论是暂时的
是否指定)。
创建递归视图。语法
CREATE RECURSIVE VIEW [ schema . ] view_name (column_names) AS SELECT ...;
相当于
CREATE VIEW [ schema . ] view_name AS WITH RECURSIVE view_name (column_names) AS (SELECT ...) SELECT column_names FROM view_name;
必须为递归视图指定视图列名称列表。
姓名
要创建的视图的名称(可选模式限定)。
列名
用于视图列的可选名称列表。如果未给出,则从查询中推断出列名。
和 ( *
view_option_name* [= *
查看选项值*] [, ... ] )
本条款规定了视图的可选参数;支持以下参数:
勾选选项
(枚举
)
此参数可以是地方的
或级联
,相当于指定使用[级联|本地]复选选项
(见下文)。可以使用在现有视图上更改此选项改变看法
.
安全屏障
(布尔值
)
如果视图旨在提供行级安全性,则应使用此选项。看见第41.5节详细信息。
查询
此选项控制可自动更新视图的行为。指定此选项后,插入
和使现代化
将检查视图上的命令以确保新行满足视图定义条件(即,检查新行以确保它们在视图中可见)。如果没有,更新将被拒绝。如果勾选选项
没有具体说明,插入
和使现代化
允许视图上的命令创建在视图中不可见的行。支持以下检查选项:
地方的
新行仅根据视图本身中直接定义的条件进行检查。不检查在基础基础视图上定义的任何条件(除非它们还指定了勾选选项
).
级联
根据视图和所有基础视图的条件检查新行。如果勾选选项
是指定的,两者都没有地方的
也没有级联
那么级联
这是假定的。
这个勾选选项
不能与递归的
意见。
请注意勾选选项
仅在可自动更新且没有而不是
触发或相反
规则。如果在具有而不是
触发,然后本地支票选项
可用于检查自动更新视图上的条件,但基本视图上的条件而不是
不会检查触发器(级联检查选项不会级联到触发器可更新视图,并且直接在触发器可更新视图上定义的任何检查选项都将被忽略)。如果视图或其任何基本关系具有相反
导致插入
或使现代化
命令,则重写的查询中的所有检查选项都将被忽略,包括在与相反
规则
# 笔记
使用俯视图
声明删除视图。
请注意,视图列的名称和类型将按您想要的方式分配。例如:
CREATE VIEW vista AS SELECT 'Hello World';
因为列名默认为?柱
; 此外,列数据类型默认为文本
,这可能不是你想要的。视图结果中字符串文字的更好样式如下:
CREATE VIEW vista AS SELECT text 'Hello World' AS hello;
对视图中引用的表的访问权限由视图所有者的权限决定。在某些情况下,这可以用于提供对底层表的安全但受限的访问。然而,并不是所有的视图都能防止篡改;看见第41.5节详细信息。在视图中调用的函数被视为使用视图直接从查询中调用的函数。因此,视图的用户必须具有调用视图使用的所有函数的权限。
什么时候创建或替换视图
在现有视图上使用时,仅更改视图的定义选择规则。其他视图属性(包括所有权、权限和非选择规则)保持不变。您必须拥有视图才能替换它(这包括成为所属角色的成员)。
# 可更新视图
简单视图可以自动更新:系统将允许插入
, 使现代化
和删去
要在视图上使用的语句与在常规表上使用的语句相同。如果视图满足以下所有条件,则该视图将自动更新:
视图中必须只有一个条目
从…起
列表,它必须是一个表或另一个可更新的视图。视图定义不能包含
具有
,不同的
,分组
,有
,限度
或抵消
最高层的条款。视图定义不能包含集合操作(
协会
,横断
或除了
)在高层。视图的选择列表不得包含任何聚合、窗口函数或集合返回函数。
可自动更新的视图可能包含可更新列和不可更新列的混合。如果列是对基础基关系的可更新列的简单引用,则该列是可更新的;否则该列为只读,如果
插入
或使现代化
语句尝试为其赋值。如果视图可自动更新,系统将转换任何
插入
,使现代化
或删去
视图上的语句转换为基础基关系上的相应语句。插入
具有关于冲突更新
我们完全支持这一条款。如果自动更新的视图包含
哪里
条件,该条件限制可以修改基关系的哪些行使现代化
和删去
关于观点的声明。然而使现代化
允许更改一行,使其不再满足哪里
条件,因此在视图中不再可见。类似地插入
命令可能会插入不满足哪里
因此,在视图中不可见(关于冲突更新
可能同样会影响视图中不可见的现有行)。这个勾选选项
可用于预防插入
和使现代化
命令创建在视图中不可见的行。如果自动更新的视图标记为
安全屏障
属性,然后所有视图的哪里
条件(以及使用标记为防漏的
)将始终在视图用户添加任何条件之前进行评估。看见第41.5节详细信息。注意,由于这个原因,最终没有返回的行(因为它们没有通过用户的哪里
条件)可能仍然会被锁定。解释
可以用来查看哪些条件在关系级别应用(因此不锁定行),哪些不应用。默认情况下,不满足所有这些条件的更复杂视图是只读的:系统不允许在视图上进行插入、更新或删除。通过创建
而不是
视图上的触发器,必须将视图上尝试的插入等转换为其他表上的适当操作。有关更多信息,请参阅创建触发器.另一种可能性是创建规则(参见创建规则),但实际上触发器更容易理解和正确使用。请注意,对视图执行插入、更新或删除操作的用户必须对视图具有相应的插入、更新或删除权限。此外,视图的所有者必须拥有基础基础基础关系的相关权限,但执行更新的用户不需要基础基础基础关系的任何权限(请参阅)第41.5节).
# 例子
创建一个包含所有喜剧电影的视图:
CREATE VIEW comedies AS
SELECT *
FROM films
WHERE kind = 'Comedy';
这将创建一个视图,其中包含电影
创建视图时的表。虽然*
用于创建视图,以后添加到表中的列将不属于视图的一部分。
使用创建视图本地支票选项
:
CREATE VIEW universal_comedies AS
SELECT *
FROM comedies
WHERE classification = 'U'
WITH LOCAL CHECK OPTION;
这将基于喜剧
查看,仅显示带有种类=‘喜剧’
和分类='U'
.任何试图插入
或使现代化
如果新行没有指定的值,视图中的一行将被拒绝分类='U'
但是这部电影友善的
不会被检查。
使用创建视图级联检查选项
:
CREATE VIEW pg_comedies AS
SELECT *
FROM comedies
WHERE classification = 'PG'
WITH CASCADED CHECK OPTION;
这将创建一个视图来检查友善的
和分类
一排排新的。
创建一个混合了可更新列和不可更新列的视图:
CREATE VIEW comedies AS
SELECT f.*,
country_code_to_name(f.country_code) AS country,
(SELECT avg(r.rating)
FROM user_ratings r
WHERE r.film_id = f.id) AS avg_rating
FROM films f
WHERE f.kind = 'Comedy';
这一观点将支持插入
, 使现代化
和删去
.来自电影
表是可更新的,而计算列国
和平均值
将是只读的。
创建由1到100的数字组成的递归视图:
CREATE RECURSIVE VIEW public.nums_1_100 (n) AS
VALUES (1)
UNION ALL
SELECT n+1 FROM nums_1_100 WHERE n < 100;
请注意,尽管递归视图的名称在本文中是模式限定的创造
,其内部自引用不符合模式。这是因为隐式创建的CTE的名称不能是模式限定的。
# 兼容性
创建或替换视图
是PostgreSQL语言的扩展。临时视图的概念也是如此。这个用(…)
子句也是一个扩展。