📜  PostgreSQL – 创建可更新的视图

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

PostgreSQL – 创建可更新的视图

视图可以表示真实表的子集,从普通表中选择某些列或某些行。我们可以使用它们来限制对原始表的访问,以便用户只能看到表的子部分。创建视图的表称为基表。可以有可更新和不可更新的视图。在您希望某些用户更新特定表的某些列的情况下,您可以使用可更新视图。如果满足以下要求,任何视图都是可更新的:

  • 视图的定义查询的 FROM 子句中应该只有一个条目
  • 选择列表不得包含任何聚合函数,例如 SUM、MIN、MAX 等。
  • GROUP BY、HAVING、LIMIT、OFFSET、DISTINCT、WITH、UNION、INTERSECT 和 EXCEPT 语句不能用于 View 中的查询。

这在示例的帮助下会更清楚。让我们看看下面的例子。下面是名为“example”的表,其中包含有关员工的一些基本数据:+

原表

创建可更新视图的语法

CREATE OR REPLACE VIEW view_name AS
SELECT column1, column2.....
FROM table_name
WHERE [condition];

创建可更新的视图

现在我们可以从原始表“example”创建一个视图,一个视图可以在选择列表中占据一列或多列,具体取决于您希望为用户提供多少访问权限。让我们创建一个可更新的视图“my_view”,分别包含三列 id、name 和 dept。

CREATE OR REPLACE VIEW my_view AS
SELECT id,name,dept from example
WHERE dept='Sales';

Output:
CREATE VIEW
Query returned successfully in 220 msec.

查询结果

我们可以通过简单地运行一个 SELECT 查询来简单地看到创建的视图的结果,如下所示:

SELECT * from my_view; 

输出



我的看法

由于有一行dept为“Sales”,因此我们在结果中只有一行。

在创建的视图中插入

现在让我们尝试使用以下语法和示例在创建的视图中执行 INSERT 操作。

SYNTAX:
INSERT INTO view_name (column1,column2,...columnN) VALUES(Val1, val2...valN);

EXAMPLE:
INSERT INTO my_view (id,name,dept)VALUES(106,'Johnson','Health');

现在,如果我们运行 SELECT 查询,在创建的视图中不会观察到任何变化,这是因为我们在插入值时添加的新部门是“健康”,但在创建我们的视图时我们提到了“销售”在 WHERE 子句中,因此在过滤器中,不会观察到任何更改。但是,我们可以在原始表中看到更改(添加了新行)。

所以现在,如果我们以“SELECT * FROM example”运行查询,输出将如下所示:

更新表

这里可以观察到的两个主要变化是——表格最后一列中的“空”值和总行数增加了 1。这表明我们已经成功创建了一个可更新的视图。现在让我们看看如何在视图本身中进行一些更新。

更新创建的视图

我们还可以使用以下语法更新创建的视图:

SYNTAX:
UPDATE view_name SET column = "New Value";

EXAMPLE:
UPDATE my_view SET dept = "Health";

OUTPUT:
UPDATE VIEW
Query returned successfully in 180 msec.

所以现在,如果我们以“SELECT * FROM example”运行查询,输出将如下所示:

决赛桌

这里可以观察到的主要变化是 - 先前将部门值保存为“销售”的行已更新为部门值作为“健康”。此外,第 2 行的顺序已更改,现在已添加到最后。

这就是我们如何在可更新视图上创建和执行操作的方式。