更新时间:2024-11-27 GMT+08:00

CREATE VIEW

功能描述

创建一个视图。视图与基本表不同,是一个虚拟的表。数据库中仅存放视图的定义,而不存放视图对应的数据,这些数据仍存放在原来的基本表中。若基本表中的数据发生变化,从视图中查询出的数据也随之改变。从这个意义上讲,视图就像一个窗口,透过它可以看到数据库中用户感兴趣的数据及变化。

注意事项

  • 视图依赖的基表重命名之后,需要将视图手动重建。
  • 创建视图时使用WITH(security_barriers)可以创建一个相对安全的视图,避免攻击者利用低成本函数的RAISE语句打印出隐藏的基表数据。
  • GUC参数view_independent打开时,支持普通视图删除列。需注意,如果存在列级约束,不支持该列的删除。

语法格式

1
2
3
CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] VIEW view_name [ ( column_name [, ...] ) ]
    [ WITH ( {view_option_name [= view_option_value]} [, ... ] ) ]
    AS query;

参数说明

  • OR REPLACE

    如果视图已存在,则重新定义。

  • TEMP | TEMPORARY

    创建临时视图。

  • view_name

    要创建的视图名称。可以用模式修饰。

    取值范围:字符串,符合标识符命名规范。

  • column_name

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

    取值范围:字符串,符合标识符命名规范。

  • view_option_name [= view_option_value]

    该子句为视图指定一个可选的参数。

    目前view_option_name支持的参数仅有security_barrier,当VIEW试图提供行级安全时,应使用该参数。

    取值范围:boolean类型,TRUE、FALSE

  • query

    为视图提供行和列的SELECT或VALUES语句。

    视图解耦功能下不支持CTE重名。例如:

    1
    2
    3
    CREATE TABLE t1(a1 INT, b1 INT);
    CREATE TABLE t2(a2 INT, b2 INT, c2 INT);
    CREATE OR REPLACE VIEW v1 AS WITH tmp AS (SELECT * FROM t2) ,tmp1 AS (SELECT b2,c2 FROM tmp WHERE b2 = (WITH RECURSIVE tmp(aa, bb) AS (SELECT a1,b1 FROM t1) SELECT bb FROM tmp WHERE aa = c2)) SELECT c2 FROM tmp1;
    

示例

创建字段spcname为pg_default组成的视图:

1
2
CREATE VIEW myView AS
SELECT * FROM pg_tablespace WHERE spcname = 'pg_default';

对已存在视图myView进行重新定义,创建字段spcname为pg_global组成的视图:

1
2
CREATE OR REPLACE VIEW myView AS
SELECT * FROM pg_tablespace WHERE spcname = 'pg_global';

创建一个由age小于12的内容组成的视图:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
DROP TABLE IF EXISTS customer;

CREATE TABLE customer
(id int, name varchar(20) , age int)
with (orientation = column,COMPRESSION=MIDDLE)
distribute by hash(id);

INSERT INTO customer VALUES (1,'lily',10),(2, 'lucy',12),(3,'lilei',15);

CREATE VIEW customer_details_view_v1 AS
SELECT * FROM customer
WHERE age < 12;

可更新的视图

当开启视图可更新参数(enable_view_update)后,系统允许对简单视图使用INSERT,UPDATE、DELETE和MERGE INTO语句进行更新。(MERGE INTO语句更新仅8.1.2及以上版本支持)

满足以下所有条件的视图可进行更新:

  • 视图定义的FROM语句中只能有一个普通表,不能是系统表、外表、delta表、toast表、错误表。
  • 视图中包含可更新的列,这些列是对基础表可更新列的简单引用。
  • 视图定义不能包含WITH、DISTINCT、GROUP BY、ORDER BY、FOR UPDATE、FOR SHARE、HAVING、TABLESAMPLE、LIMIT、OFFSET子句。
  • 视图定义不能包含UNION、INTERSECT、EXCEPT集合操作。
  • 视图定义的选择列表不能包含聚集函数、窗口函数、返回集合的函数。
  • 对于INSERT、UPDATE和DELETE语句,视图上不能有触发时机为INSTEAD OF的触发器。对于MERGE INTO语句,视图和基础表上都不能有触发器。
  • 视图定义不能包含子链接。
  • 视图定义不能包含属性为VOLATILE的函数(函数值可以在一次表扫描内改变的函数)
  • 视图定义不能对表的分布键所在列起别名,或将普通列起别名为分布键列名。
  • 视图更新操作中包含RETURNING子句时,视图定义中的列只能来自于基础表。

如果可更新的视图定义包含WHERE条件,则该条件将会限制UPDATE和DELETE语句修改基础表上的行。如果UPDATE语句更改行后不再满足WHERE条件,更新后通过视图将无法查询到。类似地如果INSERT命令插入了不满足WHERE条件的数据,插入后通过视图将无法查询到。在视图上执行插入、更新或删除的用户必须在视图和表上具有相应的插入、更新或删除权限。

相关链接

ALTER VIEWDROP VIEW