PostgreSQL 教程: DROP DATABASE 删除数据库

九月 25, 2023

摘要:在本教程中,您将学习如何使用 PostgreSQL 的DROP DATABASE语句删除数据库。

PostgreSQL DROP DATABASE 语句简介

一旦不再需要一个数据库,您可以使用DROP DATABASE语句删除它。

下面说明了DROP DATABASE语句的语法:

DROP DATABASE [IF EXISTS] database_name;

要删除一个数据库:

  • DROP DATABASE子句后指定要删除的数据库的名称。
  • 使用IF EXISTS防止删除不存在的数据库时发生错误。PostgreSQL 将发出通知。

DROP DATABASE语句将永久删除系统表数据和数据目录。此操作无法撤消,因此您必须谨慎使用。

只有超级用户和数据库所有者才能执行DROP DATABASE语句。此外,如果数据库仍有活跃连接,则无法执行DROP DATABASE语句。在这种情况下,您需要断开与数据库的连接并连接到另一个数据库,例如postgres,以执行该DROP DATABASE语句。

PostgreSQL 还提供了一个名为dropdb的实用程序,允许您删除数据库。dropdb程序在幕后执行DROP DATABASE语句。

1) 删除具有活跃连接的数据库

要删除具有活跃连接的数据库,可以按照以下步骤操作:

首先,通过查询pg_stat_activity视图找到与数据库关联的活动:

SELECT *
FROM pg_stat_activity
WHERE datname = '<database_name>';

其次,通过发出以下查询来终止活跃连接:

SELECT	pg_terminate_backend (pid)
FROM	pg_stat_activity
WHERE	pg_stat_activity.datname = '<database_name>';

请注意,如果您使用 PostgreSQL 9.1 或更早版本,请使用procpid列而不是pid列,因为 PostgreSQL 从 9.2 版本开始将procid列更改为pid列。

第三步,执行DROP DATABASE语句:

DROP DATABASE <database_name>;

PostgreSQL DROP DATABASE 示例

我们将使用 PostgreSQL 创建数据库教程中创建的数据库进行演示。

如果您还没有创建此数据库,可以使用以下CREATE DATABASE语句来创建它们:

CREATE DATABASE hrdb;
CREATE DATABASE testdb1;

1) 删除没有活跃连接的数据库的示例

要删除hrdb数据库,请使用hrdb 所有者连接到除hrdb数据库之外的数据库,例如postgres ,然后发出以下语句:

DROP DATABASE hrdb;

PostgreSQL 删除了hrdb数据库。

2) 删除具有活跃连接的数据库的示例

以下语句删除testdb1数据库:

DROP DATABASE testdb1;

然而,PostgreSQL 发出了如下错误:

ERROR: database "testdb1" is being accessed by other users
SQL state: 55006
Detail: There is 1 other session using the database.

要删除testdb1数据库,您需要终止活跃连接并删除数据库。

首先,查询pg_stat_activity视图以查找testdb1数据库正在发生哪些活动:

SELECT *
FROM pg_stat_activity
WHERE datname = 'testdb1';

PostgreSQL DROP DATABASE - testdb1 activities

testdb1数据库有一个来自localhost的连接,因此可以安全地终止此连接并删除数据库。

其次,使用以下语句终止与testdb1数据库的连接:

SELECT
	pg_terminate_backend (pg_stat_activity.pid)
FROM
	pg_stat_activity
WHERE
	pg_stat_activity.datname = 'testdb1';

第三步,发出删除testdb1数据库的DROP DATABASE命令:

DROP DATABASE testdb1;

PostgreSQL 永久删除testdb1

在本教程中,您学习了如何使用 PostgreSQL 的DROP DATABASE语句删除数据库。此外,您还学习了如何删除具有活跃连接的数据库。