PostgreSQL 数据库与模式(二)

删除数据库

如果确定一个库不需要了,可以使用DROP DATABASE语句删除一个数据库(工作中谨慎删库):

DROP DATABASE [ IF EXISTS]name;

如果使用了IF EXISTS,删除一个不存在的数据库时不会产生错误信息。删除数据库会同时删除该数据库中所有的对象,以及文件系统中的数据目录。只有数据库的拥有者才能够删除数据库。另外,如果数据库上存在用户连接,无法执行删除操作,可以连接到其他数据库执行删除命令。以下语句可以用于删除newdb数据库:

postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 test      | wdh      | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
(4 rows)

postgres=# drop database test;
DROP DATABASE
postgres=# \l
                                  List of databases
   Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
 postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
           |          |          |             |             | postgres=CTc/postgres

DROP DATABASE命令的删除操作无法恢复,删库时千万小心!千万小心!千万小心!

管理模式

创建了数据库之后,还需要创建模式(Schema)才能够存储数据库对象。通常在创建一个新的数据库时,默认会创建一个模式public。首先,创建一个新的数据库test:

postgres=# CREATE DATABASE test;
CREATE DATABASE
postgres=# \c test;
You are now connected to database "test" as user "postgres".
test=# \dn
  List of schemas
  Name  |  Owner   
--------+----------
 public | postgres
(1 row)

其中,\c用于连接到一个数据库;\dn用于查看当前数据库中的模式。也可以使用SQL语句查询模式:

select * from pg_namespace
99            pg_toast    10    
12314    pg_temp_1    10    
12315    pg_toast_temp_1    10    
11            pg_catalog    10    {postgres=UC/postgres,=U/postgres}
2200    public    10    {postgres=UC/postgres,=UC/postgres}
13887    information_schema    10    {postgres=UC/postgres,=U/postgres}
            

查询结果还显示了系统提供的其他模式。与数据库的管理类似,PostgreSQL也提供了管理模式的语句:

  • CREATE SCHEMA,创建一个新的模式。
  • ALTER SCHEMA,修改模式的属性。
  • DROP SCHEMA,删除一个模式。

来看一个简单的例子,首先在test中创建一个新的模式:

test=# create schema hr;
CREATE SCHEMA
test=# \dn
  List of schemas
  Name  |  Owner   
--------+----------
 hr     | postgres
 public | postgres
(2 rows)

创建模式时还可以指定它的拥有者:

test=# CREATE SCHEMA app AUTHORIZATION wdh;
CREATE SCHEMA
test=# \dn
  List of schemas
  Name  |  Owner   
--------+----------
 app    | wdh
 hr     | postgres
 public | postgres
以pg_开头的名称是系统保留的模式名称,用户无法创建这样的模式。创建了模式之后,我们就可以在模式中创建各种数据库对象,例如表、数据类型、函数以及运算符等等。如果需要修改已有模式的属性,可以使用ALTER SCHEMA语句:
ALTER SCHEMA name RENAME TO new_name
ALTER SCHEMA name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }

以上语句分别用于修改模式的名称和拥有者。以下语句将模式hr的拥有者改为wdh:

test=# alter schema hr owner to wdh;
ALTER SCHEMA
test=# \dn
  List of schemas
  Name  |  Owner   
--------+----------
 app    | wdh
 hr     | wdh
 public | postgres

如果模式中没有任何对象,使用以下语句即可删除该模式:

DROP SCHEMA name;

以下示例将会删除模式app:

test=# drop schema app;
DROP SCHEMA
test=# \dn
  List of schemas
  Name  |  Owner   
--------+----------
 hr     | wdh
 public | postgres
(2 rows)

如果模式中存在其他对象,以上语句无法执行;需要先删除该模式中所有的对象,或者使用以下语句级联删除这些对象:

DROP SCHEMA name CASCADE;

级联删除可能会删除一些我们意料之外的对象,使用时需要小心。数据库中的大多数对象都位于某个模式之中,这样设计的好处在于:

  • 允许多个用户使用同一个数据库而不会互相干扰,他们可以使用不同的模式来维护自己的数据。
  • 将数据库对象进行逻辑上的分组,便于管理。
  • 第三方应用可以使用单独的模式,不会与系统中的其他对象产生命名冲突。
在工作中常用的数据库对象中,最主要的就是数据表(table)。
posted @ 2023-07-02 09:29  晓枫的春天  阅读(151)  评论(0编辑  收藏  举报