PostgreSQL – 管理视图
在本文中,我们将了解 PostgreSQL 中的视图和管理视图。我们将向您介绍视图的概念,展示如何创建、修改和删除视图。最重要的是,我们还将看到如何在 DBMS 中实现视图。
PostgreSQL 中的视图可以定义为从底层基表或先前定义的视图派生的虚拟表。
请务必注意以下几点:
- 视图不一定以其物理形式存在,即它的元组并不总是物理存储在数据库中。
- 这限制了可应用于视图的更新操作。
- 查询视图绝对没有限制。
创建 PostgreSQL 视图:
要指定视图,我们使用create view语句。
Syntax:
CREATE [TEMP |TEMPORARY] VIEW view_name AS
SELECT column1, column2....
FROM table_name
WHERE [condition];
视图被赋予一个虚拟表名、一个属性名列表和一个用于指定视图内容的查询。
例子:
考虑以下表格:
现在,从下表中,假设我们希望创建一个视图,以便我们可以计算 book 表中给定的每本书的副本数。
这可以按如下方式完成:
CREATE VIEW BOOKCOUNT AS
SELECT Book_id,Title, Sum(No_of_copies)
FROM BOOK A, BOOK_COPIES B
WHERE A.Book_id = B.Book_ID
GROUP BY A.BOOK_ID;
Select * from BOOKCOUNT;
以下代码的输出将是:
更新 PostgreSQL 视图:
我们可以更改视图的定义查询,我们使用带有 OR REPLACE 添加的 CREATE VIEW 语句,如下所示:
CREATE OR REPLACE VIEW_NAME AS
SELECT column1, column2....
FROM table_name
WHERE [condition];
对视图的更新通常是不可行的,因为它对底层基表有一些副作用。例如,如果我们更新特定书籍的副本总数,我们将不得不更新bookcount表中相应的 book count 数量。
因此,我们可以说:
- 如果视图属性包含基本关系的主键以及未指定默认值的其他属性,则具有单个定义表的视图是可更新的。
- 由多个表的自然连接定义的视图不可更新。
- 使用分组和聚合函数定义的视图不可更新。
带检查选项
如果视图必须通过 INSERT、UPDATE、DELETE 语句更新,则基本上可以在视图定义的末尾添加此子句。它将允许系统拒绝违反视图更新 SQL 规则的操作。
在我们创建的给定视图 BOOKCOUNT 中,它不可更新。
如果我们尝试更新 BOOKCOUNT视图,我们将收到以下错误:
Update BOOKCOUNT set title ='ADP' where Book_ID =1;
错误:目标表 BOOKCOUNT 不可更新。
事实上,包含以下元素的任何视图都不可更新:
- 聚合函数,例如 MIN、MAX、SUM、AVG 和 COUNT。
- 清楚的
- GROUP BY 子句。
- HAVING 子句。
- UNION 或 UNION ALL 子句。
- 左连接或外连接。
- 在 SELECT 子句或 WHERE 子句中的子查询引用出现在 FROM 子句中的表。
- 在 FROM 子句中引用不可更新的视图。
- 仅引用字面量值。
- 对基表任意列的多次引用
所以我们将创建另一个视图
CREATE VIEW Example as
SELECT title, Author_Name,
FROM BOOK, BOOK_AUTHORS
WHERE BOOK.Book_ID=BOOK_AUTHORS.Book_ID;
创建的视图将是:
现在让我们更新我们创建的这个视图。
更新视图的示例
UPDATE Example
SET Author_Name='Rahul'
WHERE Author_Name='Abhishek';
更新后的视图将如下所示:
删除 PostgreSQL 视图
要删除 PostgreSQL 中的现有视图,我们可以使用 DROP VIEW 语句,如下所示:
DROP VIEW [ IF EXISTS ] view_name;
如果指定的视图名称不存在,那么显然会导致错误。因此,为了避免遇到错误,我们使用 IF EXISTS 选项。
示例:要删除我们创建的视图,我们将使用以下命令
DROP VIEW IF EXISTS BOOKCOUNT;
让我们检查输出是否相同
删除视图后,当我们尝试从视图中检索列时,它给出一个错误,指出引用的视图不存在。
https://www.geeksforgeeks.org/postgresql-recursive-query/