PostgreSQL 教程: DROP VIEW 删除视图

九月 9, 2023

摘要:在本教程中,您将学习如何使用 PostgreSQL 的DROP VIEW语句从数据库中删除一个或多个视图。

PostgreSQL DROP VIEW 语句简介

DROP VIEW语句从数据库中删除视图。下面说明了DROP VIEW语句的语法:

DROP VIEW [IF EXISTS] view_name
[CASCADE | RESTRICT]

在这个语法中:

  • 首先,在DROP VIEW关键字后指定视图的名称。
  • 其次,使用IF EXISTS选项仅删除存在的视图。如果您不使用IF EXISTS选项并删除不存在的视图,PostgreSQL 将发出错误。但是,如果您使用IF EXISTS选项,PostgreSQL 只会发出通知。
  • 第三,如果有任何对象依赖于视图,请使用RESTRICT选项拒绝删除视图。RESTRICT选项是默认选项。如果使用CASCADE选项,则DROP VIEW会自动删除依赖于视图的对象以及依赖于这些对象的所有对象。

要使用单个语句删除多个视图,请在DROP VIEW关键字后面指定以逗号分隔的视图名称列表,如下所示:

DROP VIEW [IF EXISTS] view_name1, view_name2, ...;

要执行DROP VIEW语句,您必须是视图的所有者。

PostgreSQL DROP VIEW 语句示例

请参阅示例数据库中的filmfilm_categorycategory表,如下:

film film_category category tables

让我们为练习创建新的视图。

以下语句根据这些表中的信息创建一个视图:

CREATE VIEW film_master 
AS
SELECT 
	film_id, 
	title, 
	release_year, 
	length, 
	name category
FROM 
	film
INNER JOIN film_category 
	USING (film_id)
INNER JOIN category 
	USING(category_id);

以下语句创建一个基于film_master视图实现的horror_film视图:

CREATE VIEW horror_film 
AS
SELECT 
	film_id, 
	title, 
	release_year, 
	length 
FROM 
	film_master
WHERE 
	category = 'Horror';

以下语句还创建了一个基于film_master视图实现的comedy_film视图:

CREATE VIEW comedy_film 
AS
SELECT 
	film_id, 
	title, 
	release_year, 
	length 
FROM 
	film_master
WHERE 
	category = 'Comedy';

以下语句创建一个按类别返回电影数量的视图:

CREATE VIEW film_category_stat
AS
SELECT 
	name, 
	COUNT(film_id) 
FROM category
INNER JOIN film_category USING (category_id)
INNER JOIN film USING (film_id)
GROUP BY name;

以下创建一个视图,返回每个类别的电影总长度:

CREATE VIEW film_length_stat
AS
SELECT 
	name, 
	SUM(length) film_length
FROM category
INNER JOIN film_category USING (category_id)
INNER JOIN film USING (film_id)
GROUP BY name;

1) 使用 DROP VIEW 删除一个视图

以下示例使用DROP VIEW语句来删除comedy_film视图:

DROP VIEW comedy_film;

2) 使用 DROP VIEW 语句删除具有依赖对象的视图

以下语句使用DROP VIEW语句删除film_master视图:

DROP VIEW film_master;

PostgreSQL 发出错误:

ERROR:  cannot drop view film_master because other objects depend on it
DETAIL:  view horror_film depends on view film_master
HINT:  Use DROP ... CASCADE to drop the dependent objects too.
SQL state: 2BP01

film_master有一个依赖对象,即horror_film视图。

要删除视图film_master,您需要首先删除其依赖对象,或使用CASCADE选项,如下:

DROP VIEW film_master 
CASCADE;

该语句删除film_master视图及其依赖对象(即horror_film)。它发出如下通知:

NOTICE:  drop cascades to view horror_film

3) 使用 DROP VIEW 删除多个视图

以下语句使用单个DROP VIEW语句删除多个视图:

DROP VIEW film_length_stat, film_category_stat;

概括

  • 使用DROP VIEW语句从数据库中删除一个或多个视图。

  • 使用IF EXISTS选项删除视图(如果存在)。

  • 使用CASCADE选项以递归方式删除视图及其依赖对象。