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

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;

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

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 语句。数据库等效于目录,其创建是实现定义的。

提交更正

如果您发现文档中有任何不正确的内容、与特定功能的使用体验不符或需要进一步说明的内容,请使用此表单报告文档问题。