pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
CREATE VIEW — define a new view
CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] VIEWname[ (column_name[, ...] ) ] ASquery
CREATE VIEW定义一个视图,其内容来自一个查询。该 视图不会被实际物化。相反,每次在查询中引用该视图时,都会执行定义它 的查询。
CREATE OR REPLACE VIEW与之类似,但如果已经存在 同名视图,则会用新定义替换它。新查询必须生成与现有视图查询相同的列 (即列名、列顺序和数据类型都相同),但可以在列表末尾附加额外的列。 生成输出列的计算方式则可以完全不同。
如果给出了模式名称(例如,CREATE VIEW myschema.myview ...),则视图将在指定的模式中创建。 否则,它将在当前模式中创建。临时视图存在于一个特殊模式中,因此在创建 临时视图时不能给出模式名称。 视图的名称必须与同一模式中的任何其他关系(表、序列、索引、视图、 物化视图或外部表)的名称不同。
当前,视图是只读的:系统不允许在视图上执行插入、更新或删除。你可以通过创建规则,把对视图的插入等操作重写为对其他表的适当动作,来获得可更新视图的效果。更多信息见CREATE RULE。
使用DROP VIEW语句删除视图。
应留意视图列的名称和类型是否按预期确定。例如:
CREATE VIEW vista AS SELECT 'Hello World';
这种写法在两方面都不好:列名默认是?column?,而 且列数据类型默认为unknown。如果想要在视图结果中使用 字符串字面量,可使用类似下面的写法:
CREATE VIEW vista AS SELECT text 'Hello World' AS hello;
对视图中引用的表的访问由视图所有者的权限决定。在某些情况下,这可以用于为底层表提供安全但受限的访问。不过,并非所有视图都能防止篡改;详情请参见第 37.4 节。视图调用的函数与直接从使用该视图的查询中调用时的处理方式相同。因此,视图的用户必须拥有调用视图所用全部函数的权限。
对现有视图使用CREATE OR REPLACE VIEW时,只会更改视图的定义性 SELECT 规则。其他视图属性(包括所有权、权限和非 SELECT 规则)保持不变。必须拥有该视图才能替换它(包括作为所有者角色的成员)。
创建一个由所有喜剧电影组成的视图:
CREATE VIEW comedies AS
SELECT *
FROM films
WHERE kind = 'Comedy';
SQL 标准为CREATE VIEW语句指定了一些额外的能力:
CREATE VIEWname[ (column_name[, ...] ) ] ASquery[ WITH [ CASCADED | LOCAL ] CHECK OPTION ]
完整 SQL 命令的可选子句有:
CHECK OPTION该选项与可更新视图有关。对视图的所有 INSERT 和 UPDATE 命令都会被检查,以确保数据满足视图定义条件(也就是说,新数据可以通过视图看到)。如果不满足,更新将被拒绝。
LOCAL在该视图上检查完整性。
CASCADED在该视图以及任何依赖视图上检查完整性。如果既未指定CASCADED也未指定LOCAL,则假定使用CASCADED。
CREATE OR REPLACE VIEW 是 PostgreSQL 的语言扩展。临时视图的概念也是如此。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。