《PostgreSQL 开发指南》第 05 篇 数据库与模式
发布网友
发布时间:2024-10-01 17:24
我来回答
共1个回答
热心网友
时间:2024-11-03 08:26
为方便大家学习,已制作电子版PDF专栏,免费提供下载:github.com/dongxuyang19...
在前一篇中,我们学习了 PostgreSQL 中角色和用户的基本概念。PostgreSQL 利用角色来实施数据库用户与组的功能。创建可供登录的角色(即用户)后,即可使用这些用户连接至数据库并执行相应操作。
本篇我们将探讨如何操作数据库及其中的模式。
基本概念
我们先介绍一些基本概念。
图片来自 Sumeet Shukla
创建数据库
接下来,我们将学习如何管理数据库与模式。首先查看默认安装后的数据库,使用操作系统的 postgres 用户登录,并通过 psql 工具连接:
使用 psql 工具的 \l 命令可查看当前集群中的数据库:
同时,您也可以使用 SQL 语句查看现有的数据库:
系统默认创建了 3 个数据库,其中 template0 和 template1 是模板数据库,新建数据库时默认基于 template1 进行复制;postgres 数据库是为 postgres 用户创建的默认数据库。
使用 SQL 语句 CREATE DATABASE 创建一个数据库:
其中的 name 指定了数据库的名称。例如,以下语句创建了一个名为 testdb 的数据库:
创建数据库时还可以指定许多选项,如字符集编码、所有者、默认表空间、最大连接数等。详情请参考官方文档中的完整 CREATE DATABASE 语句。
修改数据库
创建后,您可以通过 ALTER DATABASE 语句修改数据库的属性和配置:
其中,action 指定了要执行的修改操作,例如修改数据库的名称、所有者、默认表空间、数据库会话变量的默认值等。
以下语句修改 testdb 的名称:
然后将数据库 newdb 的所有者修改为 tony:
除了修改常见的属性外,ALTER DATABASE 语句还可用于修改运行时配置变量的会话默认值。
当用户连接数据库时,PostgreSQL 会使用配置文件 postgresql.conf 或启动命令 postgres 中设置的变量值作为默认值。使用 ALTER DATABASE 语句可设置指定数据库的这些配置:
对于随后连接的会话,PostgreSQL 会使用该命令设置的值覆盖 postgresql.conf 文件或命令行参数的值。注意,只有超级用户或数据库的所有者才能修改数据库的默认会话变量。
例如,以下语句将默认禁用数据库 newdb 中的索引扫描:
使用以下命令可以还原默认配置:
详细的修改选项请参考官方文档中的 ALTER DATABASE 语句。
删除数据库
如果不需要,可以使用 DROP DATABASE 语句删除一个数据库:
如果使用了 IF EXISTS,删除一个不存在的数据库时不会产生错误信息。
删除数据库会同时删除该数据库中所有的对象,以及文件系统中的数据目录。只有数据库的所有者才能删除数据库。另外,如果数据库上存在用户连接,无法执行删除操作,可以连接到其他数据库执行删除命令。
以下语句可以用于删除 newdb 数据库:
DROP DATABASE 命令的删除操作无法恢复,使用时请务必谨慎!
管理模式
创建了数据库后,还需要创建模式(Schema)才能存储数据库对象。通常在创建一个新的数据库时,默认会创建一个模式 public。
首先,我们创建一个新的数据库 testdb:
其中,\c 用于连接到一个数据库;\dn 用于查看当前数据库中的模式。也可以使用 SQL 语句查询模式:
查询结果还显示了系统提供的其他模式。
与数据库的管理类似,PostgreSQL 也提供了管理模式的语句:
以下是一个简单的例子,首先在 testdb 中创建一个新的模式:
创建模式时还可以指定它的拥有者:
以 pg_ 开头的名称是系统保留的模式名称,用户无法创建这样的模式。
创建了模式后,我们就可以在模式中创建各种数据库对象,例如表、数据类型、函数以及运算符等。这些内容将在后面的篇章中进行介绍。
如果需要修改已有模式的属性,可以使用 ALTER SCHEMA 语句:
以上语句分别用于修改模式的名称和拥有者。以下语句将模式 hr 的拥有者改为 tony:
如果模式中没有任何对象,使用以下语句即可删除该模式:
以下示例将删除模式 hr:
如果模式中存在其他对象,以上语句无法执行;需要先删除该模式中所有的对象,或者使用以下语句级联删除这些对象:
级联删除可能会删除一些我们意料之外的对象,使用时需要小心。
数据库中的大多数对象都位于某个模式中,这样设计的好处在于:
在我们使用的所有数据库对象中,最主要的就是数据表(table)。下篇我们将介绍数据库表的相关管理操作,敬请期待。