# 创建视图

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节详细信息。

查询

A.选择价值观命令,该命令将提供视图的列和行。

使用[级联|本地]复选选项

此选项控制可自动更新视图的行为。指定此选项后,插入使现代化将检查视图上的命令以确保新行满足视图定义条件(即,检查新行以确保它们在视图中可见)。如果没有,更新将被拒绝。如果勾选选项没有具体说明,插入使现代化允许视图上的命令创建在视图中不可见的行。支持以下检查选项:

地方的

新行仅根据视图本身中直接定义的条件进行检查。不检查在基础基础视图上定义的任何条件(除非它们还指定了勾选选项).

级联

根据视图和所有基础视图的条件检查新行。如果勾选选项是指定的,两者都没有地方的也没有级联那么级联这是假定的。

这个勾选选项不能与递归的意见。

请注意勾选选项仅在可自动更新且没有而不是触发或相反规则。如果在具有而不是触发,然后本地支票选项可用于检查自动更新视图上的条件,但基本视图上的条件而不是不会检查触发器(级联检查选项不会级联到触发器可更新视图,并且直接在触发器可更新视图上定义的任何检查选项都将被忽略)。如果视图或其任何基本关系具有相反导致插入使现代化命令,则重写的查询中的所有检查选项都将被忽略,包括在与相反规则

# 笔记

使用俯视图声明删除视图。

请注意,视图列的名称和类型将按您想要的方式分配。例如:

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语言的扩展。临时视图的概念也是如此。这个用(…)子句也是一个扩展。

# 另见

改变看法, 俯视图, 创建物化视图