2024 年 9 月 26 日:PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本: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

CREATE DATABASE

CREATE DATABASE — 创建一个新的数据库

概要

CREATE DATABASE name
    [ WITH ] [ OWNER [=] user_name ]
           [ TEMPLATE [=] template ]
           [ ENCODING [=] encoding ]
           [ STRATEGY [=] strategy ]
           [ LOCALE [=] locale ]
           [ LC_COLLATE [=] lc_collate ]
           [ LC_CTYPE [=] lc_ctype ]
           [ BUILTIN_LOCALE [=] builtin_locale ]
           [ ICU_LOCALE [=] icu_locale ]
           [ ICU_RULES [=] icu_rules ]
           [ LOCALE_PROVIDER [=] locale_provider ]
           [ COLLATION_VERSION = collation_version ]
           [ TABLESPACE [=] tablespace_name ]
           [ ALLOW_CONNECTIONS [=] allowconn ]
           [ CONNECTION LIMIT [=] connlimit ]
           [ IS_TEMPLATE [=] istemplate ]
           [ OID [=] oid ]

描述

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

要创建数据库,您必须是超级用户或具有特殊的 CREATEDB 权限。请参阅 CREATE ROLE

默认情况下,新数据库将通过克隆标准系统数据库 template1 创建。可以通过编写 TEMPLATE name 来指定不同的模板。特别是,通过编写 TEMPLATE template0,您可以创建一个原始数据库(其中不存在用户定义的对象,并且系统对象尚未被修改),其中只包含 PostgreSQL 版本预定义的标准对象。如果您希望避免复制可能已添加到 template1 中的任何安装本地对象,这将很有用。

参数

name #

要创建的数据库的名称。

user_name #

将拥有新数据库的用户角色名称,或 DEFAULT 以使用默认值(即执行命令的用户)。要创建由另一个角色拥有的数据库,您必须能够对该角色执行 SET ROLE

template #

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

encoding #

在新数据库中使用的字符集编码。指定一个字符串常量(例如,'SQL_ASCII'),或一个整数编码编号,或 DEFAULT 以使用默认编码(即模板数据库的编码)。PostgreSQL 服务器支持的字符集在 第 23.3.1 节 中描述。有关其他限制,请参见下文。

strategy #

用于创建新数据库的策略。如果使用 WAL_LOG 策略,则数据库将逐块复制,并且每个块将分别写入预写日志。这是模板数据库很小的情况下的最有效策略,因此它是默认策略。较旧的 FILE_COPY 策略也可用。此策略为目标数据库使用的每个表空间写入一个小的记录到预写日志中。每个这样的记录表示在文件系统级别将整个目录复制到新位置。虽然这在很大程度上减少了预写日志的容量,尤其是在模板数据库很大时,但它也迫使系统在创建新数据库之前和之后执行检查点。在某些情况下,这可能会对整体系统性能产生明显的负面影响。

locale #

设置新数据库中的默认排序规则和字符分类。排序规则会影响应用于字符串的排序顺序,例如,在使用 ORDER BY 的查询中,以及在文本列索引中使用的排序顺序。字符分类会影响字符的分类,例如,小写、大写和数字。还会设置操作系统环境的关联方面,LC_COLLATELC_CTYPE。默认值为与模板数据库相同的设置。有关详细信息,请参阅 第 23.2.2.3.1 节第 23.2.2.3.2 节

可以通过单独设置 lc_collatelc_ctypebuiltin_localeicu_locale 来覆盖。

如果 locale_providerbuiltin,则必须指定 localebuiltin_locale 并将其设置为 CC.UTF-8

提示

其他区域设置 lc_messageslc_monetarylc_numericlc_time 不固定在每个数据库,并且不会由此命令设置。如果您想使它们成为特定数据库的默认值,可以使用 ALTER DATABASE ... SET

lc_collate #

在数据库服务器的操作系统环境中设置 LC_COLLATE。默认值为 locale 的设置(如果已指定),否则与模板数据库相同的设置。有关其他限制,请参见下文。

如果 locale_providerlibc,则还会设置在新数据库中使用的默认排序规则,覆盖 locale 的设置。

lc_ctype #

在数据库服务器的操作系统环境中设置 LC_CTYPE。默认值为 locale 的设置(如果已指定),否则与模板数据库相同的设置。有关其他限制,请参见下文。

如果 locale_providerlibc,则还会设置在新数据库中使用的默认字符分类,覆盖 locale 的设置。

builtin_locale #

指定数据库默认排序规则和字符分类的内置提供程序区域设置,覆盖 locale 的设置。区域设置提供程序 必须是 builtin。默认值为 locale 的设置(如果已指定),否则与模板数据库相同的设置。

可用于 builtin 提供程序的区域设置是 CC.UTF-8

icu_locale #

指定 ICU 区域设置(请参阅 第 23.2.2.3.2 节)以用于数据库默认排序规则和字符分类,覆盖 locale 的设置。区域设置提供程序 必须是 ICU。默认值为 locale 的设置(如果已指定),否则与模板数据库相同的设置。

icu_rules #

指定其他排序规则以自定义此数据库默认排序规则的行为。这仅适用于 ICU。有关详细信息,请参阅 第 23.2.3.4 节

locale_provider #

指定用于此数据库默认排序规则的提供程序。可能的值是 builtinicu(如果服务器是在启用 ICU 支持的情况下构建的)或 libc。默认情况下,提供程序与 template 相同。有关详细信息,请参阅 第 23.1.4 节

collation_version #

指定要与数据库一起存储的排序规则版本字符串。通常,这应该省略,这将导致版本从操作系统提供的数据库排序规则的实际版本计算得出。此选项旨在由 pg_upgrade 用于从现有安装中复制版本。

另请参阅 ALTER DATABASE,了解如何处理数据库排序规则版本不匹配。

tablespace_name #

与新数据库关联的表空间名称,或使用DEFAULT来使用模板数据库的表空间。 此表空间将成为在此数据库中创建的对象使用的默认表空间。 有关更多信息,请参阅CREATE TABLESPACE

allowconn #

如果为 false,则没有人可以连接到此数据库。 默认值为 true,允许连接(除非受其他机制限制,例如 GRANT/REVOKE CONNECT)。

connlimit #

可以同时连接到此数据库的连接数量。 -1(默认值)表示没有限制。

istemplate #

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

oid #

将用于新数据库的对象标识符。 如果未指定此参数,则 PostgreSQL 将自动选择合适的 OID。 此参数主要用于 pg_upgrade 的内部使用,并且只有 pg_upgrade 可以指定小于 16384 的值。

可选参数可以按任何顺序编写,不一定是上面所示的顺序。

注意事项

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

类似于无法初始化数据库目录的错误很可能是与数据目录权限不足、磁盘已满或其他文件系统问题有关。

使用 DROP DATABASE 删除数据库。

程序 createdb 是此命令的包装程序,为了方便提供。

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

虽然可以通过指定其名称作为模板来复制除 template1 之外的数据库,但这并非(尚未)作为通用的 COPY DATABASE 功能。 主要限制是,复制时,其他会话不能连接到模板数据库。 如果 CREATE DATABASE 启动时存在其他连接,则它将失败;否则,对模板数据库的新连接将被锁定,直到 CREATE DATABASE 完成。 有关更多信息,请参阅第 22.3 节

为新数据库指定的角色集编码必须与所选的区域设置(LC_COLLATELC_CTYPE)兼容。 如果区域设置是 C(或等效的 POSIX),则允许所有编码,但对于其他区域设置,只有一种编码才能正常工作。(但是,在 Windows 上,UTF-8 编码可以与任何区域设置一起使用。)CREATE DATABASE 将允许超级用户指定 SQL_ASCII 编码,无论区域设置如何,但此选择已弃用,如果将与区域设置不兼容编码的数据存储在数据库中,可能会导致字符字符串函数行为异常。

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

目前没有使用具有非确定性比较的数据库区域设置的选项(有关说明,请参阅CREATE COLLATION)。 如果需要,则需要使用每列排序规则。

CONNECTION LIMIT 选项仅强制执行近似值;如果两个新会话在大约同一时间启动,而数据库只剩下一个连接 ,则这两个会话都可能失败。 此外,该限制不会对超级用户或后台工作进程强制执行。

示例

创建新数据库

CREATE DATABASE lusiadas;

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

CREATE DATABASE sales OWNER salesapp TABLESPACE salesspace;

创建一个具有不同区域设置的数据库 music

CREATE DATABASE music
    LOCALE 'sv_SE.utf8'
    TEMPLATE template0;

在此示例中,如果指定的区域设置与 template1 中的区域设置不同,则需要 TEMPLATE template0 子句。(如果它不不同,则显式指定区域设置是多余的。)

创建一个具有不同区域设置和不同角色集编码的数据库 music2

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

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

请注意,区域设置名称是特定于操作系统的,因此上述命令可能不会在任何地方都以相同的方式工作。

兼容性

SQL 标准中没有 CREATE DATABASE 语句。 数据库等效于目录,其创建是实现定义的。

提交更正

如果您在文档中看到任何不正确的内容,与您对特定功能的体验不符,或者需要进一步说明,请使用 此表格 报告文档问题。