📜  PostgreSQL – 创建可更新的视图(1)

📅  最后修改于: 2023-12-03 15:18:38.580000             🧑  作者: Mango

PostgreSQL – 创建可更新的视图

在PostgreSQL中,视图可以用来提供用户友好的数据查询方式,以及抽象远程数据的细节。不过,大多数视图都是只读的,在视图中的数据是不能被修改的。但是,PostgreSQL8.1中提供了可更新视图的功能,让我们可以直接通过视图对底层表进行CRUD操作。

创建可更新视图

创建可更新视图的语法和创建只读视图的语法几乎一样,只是在创建视图时需要添加WITH CHECK OPTION语句:

CREATE OR REPLACE VIEW view_name AS SELECT column1, column2, ... FROM table_name WHERE condition WITH CHECK OPTION;

WITH CHECK OPTION是一个约束条件,它保证了视图中的每一行数据都可以映射到底层表中的一行。也就是说,任何更新操作都必须满足WITH CHECK OPTION的约束条件,否则修改将被拒绝。

可更新视图的操作

创建了可更新视图之后,就可以像操作普通表一样对其进行CRUD操作了。以下是可用的操作:

  • INSERT:向视图中插入新行时,需要保证插入的数据能够映射到底层表中的一行;
  • UPDATE:更新视图中的数据时,需要保证更新的数据仍能够映射到底层表中的相应行;
  • DELETE:从视图中删除数据时,需要保证删除的数据仍能够映射到底层表中的相应行。

需要注意的是,不是所有的视图都支持可更新操作。必须满足以下条件:

  • 视图没有聚合、计算列和DISTINCT;
  • 视图没有使用WITH;
  • 视图没有使用子查询和临时表。
示例

我们来看一个例子,首先创建一个学生表,然后创建一个视图,用于检索所有年级为1的学生:

CREATE TABLE students (
    id SERIAL PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    grade INT NOT NULL
);
 
INSERT INTO students (name, grade) VALUES ('Tom', 1), ('Jerry', 2), ('Marry', 1), ('John', 3);
 
CREATE OR REPLACE VIEW grade1_students AS SELECT id, name, grade FROM students WHERE grade = 1 WITH CHECK OPTION;

接下来,我们尝试通过可更新视图进行CRUD操作:

-- 查询视图
SELECT * FROM grade1_students;
 
-- 向视图中插入数据
INSERT INTO grade1_students (name, grade) VALUES ('Jack', 1);
 
-- 修改视图中的数据
UPDATE grade1_students SET name = 'Rose' WHERE id = 1;
 
-- 从视图中删除数据
DELETE FROM grade1_students WHERE id = 3;

我们可以看到,可更新视图和普通表一样可以进行CRUD操作,但需要满足WITH CHECK OPTION的约束条件,否则修改将被拒绝。