CREATE VIEW

Name

CREATE VIEW -- 定义一个视图

Synopsis

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

描述

CREATE VIEW 定义一个查询的视图。 这个视图不是物理上实际存在(于磁盘)的。 具体的说,自动生成一个改写索引规则(一个 ON SELECT 规则)的查询用以支持在视图上的检索。

CREATE OR REPLACE VIEW 类似,不过是如果一个同名的视图已经存在,那么就替换它。 你只能用一个生成相同字段的新查询替换一个视图(也就是说,同样字段名和数据类型)。

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

参数

TEMPORARYTEMP

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

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

name

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

column_name

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

query

一个将为视图提供行和列的查询(也就是一条 SELECT 语句)。

请参阅 SELECT 获取有效查询的更多信息。

注意

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

使用 DROP VIEW 语句删除视图。

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

CREATE VIEW vista AS SELECT 'Hello World';

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

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

对视图引用的表的访问的权限由视图的所有者决定。 不过,在视图里调用的函数当作他们直接从使用视图的查询里调用看待。 因此,视图的用户必须有使用视图调用的所有函数的权限。

例子

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

CREATE VIEW kinds 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

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

CASCADE

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

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

又见

DROP VIEW