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

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 策略也可用。此策略为目标数据库使用的每个表空间写入一个小的写前日志记录。每个此类记录代表在文件系统级别将整个目录复制到一个新位置。虽然这大大减少了写前日志量,尤其是在模板数据库很大的情况下,但它还会强制系统在创建新数据库之前和之后都执行一次检查点。在某些情况下,这可能会对整体系统性能产生明显的负面影响。FILE_COPY 策略受 file_copy_method 设置的影响。

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-8PG_UNICODE_FAST

提示

其他区域设置 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 的设置。locale provider 必须是 builtin。默认值是 locale 的设置(如果已指定);否则与模板数据库的设置相同。

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

icu_locale #

为数据库默认排序顺序和字符分类指定 ICU 区域设置(参见 第 23.2.2.3.2 节),覆盖 locale 的设置。locale provider 必须是 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 语句。数据库等同于目录,其创建是实现定义的。

提交更正

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