九月 8, 2023
摘要:在本教程中,我们将讨论可更新视图的要求,并向您展示如何在 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
。
当您执行更新操作时,您必须对视图具有相应的权限,但不需要对基础表具有权限。但是,视图所有者必须具有基础表的相关权限。
PostgreSQL 可更新视图示例
首先,使用CREATE VIEW
语句创建一个新的可更新视图,名为usa_cities
。该视图包含city
表中位于美国(国家/地区 ID 为 103)的所有城市。
CREATE VIEW usa_cities AS SELECT
city,
country_id
FROM
city
WHERE
country_id = 103;
接下来,通过执行以下SELECT
语句检查usa_cities
视图中的数据:
SELECT
*
FROM
usa_cities;
然后,使用以下INSERT
语句通过usa_cities
视图将新城市插入city
表中:
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';
该条目已通过usa_cities
视图从city
表中删除。
在本教程中,我们展示了如何创建 PostgreSQL 可更新视图,并向您介绍了视图要能可以更新必须满足的条件。