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 行的顺序已更改,现在已添加到最后。
这就是我们如何在可更新视图上创建和执行操作的方式。