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)。