PostgreSQL DROP DATABASE 删除数据库

PostgreSQL 允许您使用 DROP DATABASE 语句删除已经存在的数据库。

当我们不需要某个数据库的时候,我们可以将数据库删除。在 PostgreSQL 中,DROP DATABASE 语句用来删除一个数据库。

注意DROP DATABASE 语句将永久删除数据库和数据库中的所有表,请谨慎操作。

DROP DATABASE 语法

要执行 DROP DATABASE 语句,您需要是超级用户或者是数据库的所有者。

下面是 PostgreSQL DROP DATABASE 语句的语法:

DROP DATABASE [IF EXISTS] database_name;

在上面的语法中:

  • database_name 是要删除的数据库的名称。您需要提供一个已经存在的数据库的名称。
  • 如果您提供了一个不存在的数据库名称,PostgreSQL 将给出一个错误报告。您可以使用 IF EXISTS 选项防止输出此错误。 PostgreSQL 对于不存在的数据库将给出一个通知。

您不能删除仍有活动连接的数据库。此时, PostgreSQL 将给出一个错误报告。您可以使用 pg_terminate_backend() 函数结束活动连接,再删除此数据库。

PostgreSQL DROP DATABASE 实例

在本实例中,我们将使用 psql 工具连接 PostgreSQL 服务器, 创建一个数据库 test_db 并删除它。

  1. 首先,请使用具有权限的用户登录 PostgreSQL 服务器:

    [~] psql -U postgres
    psql (14.4)
    Type "help" for help.
    
  2. 其次,使用默认的选项创建 test_db 数据库:

    CREATE DATABASE test_db;
    
    CREATE DATABASE

    如果您输入了一个已经存在的数据库名称, PostgreSQL 将返回一个错误:ERROR: database "test_db" already exists

  3. 然后,使用 \c 命令切换到刚刚创建的 test_db 数据库:

    \c test_db;
    
    You are now connected to database "test_db" as user "postgres".
  4. 然后,尝试删除 test_db 数据库

    DROP DATABASE test_db;
    
    ERROR:  cannot drop the currently open database

    也就是说,您不能删除当前打开的数据库。

  5. 保持刚刚的会话,打开一个新的会话并登陆,然后尝试删除:

    DROP DATABASE test_db;
    
    ERROR:  database "test_db" is being accessed by other users
    DETAIL:  There is 1 other session using the database.

    这里, PostgreSQL 报告了一个错误: 数据库 test_db 正在被其他用户访问。

  6. 关闭以前的会话,并回到这个会话,重新尝试删除:

    DROP DATABASE test_db;
    
    DROP DATABASE

    此时,数据库已经被删除。

查看数据库的活动连接并关闭

有时候,并不是我们自己连接了要删除的数据库。我们可以从 pg_stat_activity 视图中查询数据库中的活动连接,如下:

SELECT
  pid,
  usename,
  application_name
FROM
  pg_stat_activity
WHERE
  datname = 'test_db';
  pid  | usename  | application_name
-------+----------+------------------
 37771 | postgres | psql
(1 row)

然后,使用 pg_terminate_backend() 函数结束刚刚返回的活动连接:

SELECT pg_terminate_backend(37771);
 pg_terminate_backend
----------------------
 t
(1 row)

然后,使用 DROP DATABASE 删除数据库就可以了。

结论

PostgreSQL DROP DATABASE 语句用来删除已经存在的数据库。删除数据库是一个很危险的操作,请务必小心。