创建 PostgreSQL 可更新视图
在本教程中,我们将讨论可更新视图的要求,并向您展示如何在 PostgreSQL 中创建可更新视图。
摘要:在本教程中,我们将讨论可更新视图的要求,并向您展示如何在 PostgreSQL 中创建可更新视图。
当满足以下条件时,PostgreSQL 视图是可更新的:
- 视图的定义查询在
FROM子句中必须只有一个条目,它可以是一个表或另一个可更新的视图。 - 定义查询不得在顶层包含以下子句之一:GROUP BY、HAVING、LIMIT、OFFSET、DISTINCT、WITH、UNION、INTERSECT和EXCEPT。
- 选择列表不得包含任何窗口函数 、任何集合返回函数或任何聚合函数,例如SUM、COUNT、AVG、MIN和 MAX。
可更新视图可能包含可更新和不可更新的列。如果您尝试插入或更新不可更新的列,PostgreSQL 将引发错误。
当您执行INSERT、UPDATE或DELETE等更新操作时,PosgreSQL 会将此语句转换为底层表的相应语句。
如果您 WHERE 在视图的定义查询中有条件,您仍然可以更新或删除通过视图不可见的行。但是,如果要避免这种情况,可以 CHECK OPTION 在定义视图时使用。
执行更新操作时,必须对视图有相应的权限,但不需要对底层表有权限。但是,视图所有者必须具有基础表的相关权限。
PosgreSQL 可更新视图示例
首先, usa_cities 使用 [CREATE VIEW](https://www.postgresqltutorial.com/managing-postgresql-views/) 语句创建一个新的可更新视图名称。此视图包含 city 表中位于美国且国家/地区 ID 为 103 的所有城市。
CREATE VIEW usa_cities AS SELECT
city,
country_id
FROM
city
WHERE
country_id = 103;
接下来, usa_cities 通过执行以下 SELECT 语句检查视图中的数据:
SELECT
*
FROM
usa_cities;
然后,使用以下语句 city 通过 usa_cities 视图向表中插入一个新城市 INSERT :
INSERT INTO usa_cities (city, country_id)
VALUES('San Jose', 103);
之后,检查 city 表的内容:
SELECT
city,
country_id
FROM
city
WHERE
country_id = 103
ORDER BY
last_update DESC;
我们在 city 表中添加了一个新条目。

最后,删除通过 usa_cities 视图添加的条目。
DELETE
FROM
usa_cities
WHERE
city = 'San Jose';
该条目已 city 通过 usa_cities 视图从表中删除。
在本教程中,我们展示了如何创建 PostgreSQL 可更新视图,并向您介绍了视图必须满足才能自动更新的条件