CREATE VIEW

Name

CREATE VIEW -- d定义一个新视图

Synopsis

CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] VIEW name [ ( column_name [, ...] ) ]
    AS query

描述

CREATE VIEW定义一个查询的视图。这个视图不是物理上实际存在的, 并且在该视图每次被引用的时候都会运行一次query。

CREATE OR REPLACE VIEW类似,不过是如果一个同名的视图已经存在,那么将替换它。 新查询必须生成现有视图查询产生的相同列(这就是说,同列名有相同的顺序和相同的 数据类型),但会添加额外的列到列表末。产生输出列的运算可能是完全不同的。

如果给出了一个模式名(比如CREATE VIEW myschema.myview ...),那么该视图将在指定的模式中创建, 否则将在当前模式中创建。临时视图存在于一个特殊的模式里,所以创建临时视图的时候, 不用给出模式名。新视图名字必需和同一模式中任何其它视图、表、序列、索引的名字不同。

参数

TEMPORARY or TEMP

如果声明了这个子句,那么视图就以临时视图的方式创建。 临时视图在当前会话结束的时候将被自动删除。当前会话中,在临时视图存在的期间, 将无法看到现有的同名关系,除非用模式修饰的名字引用它们。

如果视图引用的任何基础表是临时的,那么视图将被创建为临时的(不管是否声明了TEMPORARY)。

name

所要创建的视图名称(可以有模式修饰)

column_name

一个可选的名字列表,用作视图的字段名。如果没有给出,字段名取自查询。

query

一个将为视图提供行和列的SELECTVALUES 语句。

注意

目前,视图是只读的:系统将不允许在视图上插入、更新、删除数据。 你可以通过在视图上创建把插入等动作重写为向其它表做合适操作的规则来实现可更新视图的效果。 更多信息详见CREATE RULE

使用DROP VIEW语句删除视图。

请注意视图字段的名字和类型不一定是你们期望的那样。比如,

CREATE VIEW vista AS SELECT 'Hello World';

在两个方面很糟糕:字段名缺省是?column?并且字段的数据类型缺省是unknown。 如果你想视图的结果是一个字符串文本,那么请像下面这样使用:

CREATE VIEW vista AS SELECT text 'Hello World' AS hello;

对视图引用的表的访问的权限由视图的所有者决定。 在一些情况下,这可以用于提供安全,但限制访问地层表。 然而,并不是所有的视图是防止篡改的;参阅 Section 37.4 获取详细信息。在视图里调用的函数当作他们直接从使用视图的查询里调用看待。 因此,视图的用户必须有使用视图调用的所有函数的权限。

CREATE OR REPLACE VIEW用于现有视图,只有视图的定义SELECT 规则更改。其他试图属性,包括所属关系、许可权限和non-SELECT规则, 保持不变。你必须拥有视图来替换它(这包括成为所属关系的一员)。

例子

创建一个由所有喜剧电影组成的视图:

CREATE VIEW comedies AS
    SELECT *
    FROM films
    WHERE kind = 'Comedy';

兼容性

SQL标准为CREATE VIEW声明了一些附加的功能:

CREATE VIEW name [ ( column_name [, ...] ) ]
    AS query
    [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]

完整的SQL命令可选的子句是:

CHECK OPTION

这个选项用于可更新视图。所有对视图的INSERTUPDATE都要经过视图定义条件的校验。 也就是说,新数据应该可以通过视图看到。如果没有通过校验,更新将被拒绝

LOCAL

对这个视图进行完整性检查。

CASCADED

对此视图和任何相关视图进行完整性检查。 在既没有声明CASCADED也没有声明LOCAL时,假设为CASCADED

CREATE OR REPLACE VIEWPostgreSQL的扩展。 临时视图的概念也是扩展。

又见

ALTER VIEW, DROP VIEW