📜  PostgreSQL – 管理视图

📅  最后修改于: 2022-05-13 01:57:14.897000             🧑  作者: Mango

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/