创建新数据库的前提是 PostgreSQL 服务进程必须已经处于正常运行状态(参见 Section 18.3)。
创建数据库使用标准 SQL 命令 CREATE DATABASE:
CREATE DATABASE name;
其中 name 遵循标准的 SQL 标识符规范。当前执行建库命令的角色自动成为新数据库的所有者(Owner)。数据库所有者拥有在未来销毁该库的特权(该销毁操作会级联抹除库内包含的全部对象,即便部分对象归属于其他角色)。
创建数据库属于受控的特权操作,需要当前角色具备 CREATEDB 特权或超级用户身份,详见 Section 21.2。
由于执行 CREATE DATABASE 首先必须成功连接到某个既有数据库,因此在全新初始化的空集群中,必须预先存在一个用于引导的初始库。该初始数据库在执行集群初始化命令 initdb 时由系统自动创建(参见 Section 18.2),默认命名为 postgres。因此为了创建第一个业务库,你可以首先连接至 postgres。
此外,集群在初始化时还会自动创建两个特殊的系统模板库:template1 与 template0。在集群内部创建任何新数据库时,系统在底层实际上是对 template1 执行物理克隆。这意味着你在 template1 中所做的任何结构变更(如预先安装插件扩展),都会自动继承到后续创建的每一个新数据库中。因此,除非你确实希望将某项配置或对象全局推广至所有新库,否则应避免随意在 template1 中创建业务对象。template0 则是原始出厂状态的纯净底本,严禁对其进行任何改动。
在操作系统命令行层面,系统提供了便捷的包装程序 createdb:
createdb dbname
如果不带任何参数调用 createdb,它将默认创建一个与当前操作系统用户名同名的数据库。
管理员也可以为其他业务角色代建数据库并直接指定其归属所有者:
CREATE DATABASEdbnameOWNERrolename;
或者在 Shell 中执行:
createdb -Orolenamedbname