↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1 / 7.0 / 6.5 / 6.4
历史版本PostgreSQL 10 已于 2022 年 11 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

CREATE DATABASE

CREATE DATABASE — 创建一个新数据库

大纲

CREATE DATABASE name
    [ WITH ] [ OWNER [=] user_name ]
           [ TEMPLATE [=] template ]
           [ ENCODING [=] encoding ]
           [ LC_COLLATE [=] lc_collate ]
           [ LC_CTYPE [=] lc_ctype ]
           [ TABLESPACE [=] tablespace_name ]
           [ ALLOW_CONNECTIONS [=] allowconn ]
           [ CONNECTION LIMIT [=] connlimit ]
           [ IS_TEMPLATE [=] istemplate ]

描述

CREATE DATABASE 创建一个新的 PostgreSQL 数据库。

要创建数据库,你必须是超级用户,或者拥有特殊的 CREATEDB 权限。见CREATE USER。

默认情况下,新数据库通过克隆标准系统数据库 template1 来创建。可以通过写成 TEMPLATE name 指定其他模板。特别是,写成 TEMPLATE template0 时,可以创建一个全新的数据库,它只包含你的 PostgreSQL 版本预定义的标准对象。如果你希望避免复制任何可能已添加到 template1 中的站点本地附加对象,这会很有用。

参数

name

要创建的数据库名称。

user_name

新数据库所有者的角色名称,或使用 DEFAULT 以使用默认值(即执行命令的用户)。要创建由其他角色拥有的数据库,你必须是该角色的直接或间接成员,或为超级用户。

template

用于创建新数据库的模板名称,或者指定 DEFAULT 以使用默认模板(template1)。

encoding

新数据库要使用的字符集编码。可指定字符串常量(例如 'SQL_ASCII')、整数编码编号,或者指定 DEFAULT 以使用默认编码(即模板数据库的编码)。PostgreSQL 服务器支持的字符集见第 23.3.1 节。其他限制见下文。

lc_collate

新数据库中使用的排序规则(LC_COLLATE)。这会影响字符串的排序顺序,例如在带有 ORDER BY 的查询中,以及文本列索引中使用的顺序。默认值是使用模板数据库的排序规则。请参见下文的其他限制。

lc_ctype

新数据库中使用的字符分类(LC_CTYPE)。这会影响字符的分类,例如小写、大写和数字。默认值是使用模板数据库的字符分类。请参见下文的其他限制。

tablespace_name

将与新数据库关联的表空间名称,或者指定 DEFAULT 以使用模板数据库的表空间。该表空间将成为在此数据库中创建对象时使用的默认表空间。详见CREATE TABLESPACE。

allowconn

如果为 false,则任何人都不能连接到该数据库。默认值为 true,即允许连接(但仍受其他机制限制,例如 GRANT/REVOKE CONNECT)。

connlimit

可对该数据库建立的并发连接数。-1(默认值)表示不受限制。

istemplate

如果为 true,则任何具有 CREATEDB 权限的用户都可以克隆该数据库;如果为 false(默认值),则只有超级用户或该数据库的拥有者可以克隆它。

可选参数可以按任意顺序书写,不一定要按照上面的顺序。

注解

CREATE DATABASE 不能在事务块内执行。

形如“could not initialize database directory”的错误,多半与数据目录权限不足、磁盘已满或其他文件系统问题有关。

使用DROP DATABASE删除数据库。

程序createdb是这个命令的一个包装器程序,为方便使用而提供。

数据库级配置参数(通过ALTER DATABASE设置)和数据库级权限(通过GRANT设置)不会从模板数据库复制。

尽管可以通过把某个数据库名指定为模板,从而复制它而不是复制 template1,但这(至少目前)并不打算作为一种通用的“COPY DATABASE”功能。主要限制是,在复制模板数据库期间,不能有任何其他会话连接到该数据库。CREATE DATABASE 在启动时如果发现存在任何其他连接,就会失败;否则,在 CREATE DATABASE 完成之前,将阻止对模板数据库建立新的连接。详见第 22.3 节。

为新数据库指定的字符集编码必须与所选区域设置(LC_COLLATE 和 LC_CTYPE)兼容。如果区域设置为 C(或等价的 POSIX),则允许所有编码;但对于其他区域设置,只有一种编码能够正常工作。(不过,在 Windows 上,UTF-8 编码可与任何区域设置一起使用。)CREATE DATABASE 允许超级用户不考虑区域设置而指定 SQL_ASCII 编码,但这种选择已弃用;如果数据库中存储了与该区域设置不兼容编码的数据,字符串函数的行为可能会出错。

编码和区域设置必须与模板数据库的设置一致,除非使用 template0 作为模板。这是因为其他数据库可能包含与指定编码不匹配的数据,或者包含排序顺序会受 LC_COLLATE 和 LC_CTYPE 影响的索引。复制这样的数据会导致数据库在新设置下被视为损坏。不过,已知 template0 不包含任何会受此影响的数据或索引。

CONNECTION LIMIT 选项只是近似地被强制执行;如果两个新会话几乎同时启动,而该数据库只剩下一个连接“槽”,则两者都可能失败。此外,该限制对超级用户或后台工作进程无效。

示例

要创建一个新数据库:

CREATE DATABASE lusiadas;

要创建一个由用户 salesapp 拥有、默认表空间为 salesspace 的数据库 sales:

CREATE DATABASE sales OWNER salesapp TABLESPACE salesspace;

要创建一个使用不同区域设置的数据库 music:

CREATE DATABASE music
    LC_COLLATE 'sv_SE.utf8' LC_CTYPE 'sv_SE.utf8'
    TEMPLATE template0;

在这个示例中,如果指定的区域设置与 template1 中的不同,则必须使用 TEMPLATE template0 子句。(如果相同,那么显式指定区域设置就是多余的。)

要创建一个使用不同区域设置和不同字符集编码的数据库 music2:

CREATE DATABASE music2
    LC_COLLATE 'sv_SE.iso885915' LC_CTYPE 'sv_SE.iso885915'
    ENCODING LATIN9
    TEMPLATE template0;

指定的区域设置和编码设置必须匹配,否则会报错。

请注意,区域设置名称是特定于操作系统的,因此上述命令未必在所有环境中都以相同方式工作。

兼容性

SQL 标准中没有 CREATE DATABASE 语句。数据库相当于目录,而目录的创建由实现定义。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。