Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

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 名称。特别是,通过写 TEMPLATE template0,您可以创建初始数据库(其中不包含任何用户定义的对象,并且系统对象未更改),该数据库仅包含 PostgreSQL 版本预先定义的标准对象。如果您希望避免复制可能已添加到 template1 中的任何安装本地对象,这将非常有用。

参数

名称 #

要创建的数据库的名称。

用户名 #

拥有新数据库的用户角色名称,或使用 DEFAULT 指定默认用户(即执行命令的用户)。要创建归其他角色所有的数据库,您必须能够对该角色 SET ROLE

模板 #

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

编码 #

在新数据库中使用的字符集编码。指定字符串常数(例如 'SQL_ASCII')、整数编码数或 DEFAULT 以使用默认编码(即模板数据库的编码)。PostgreSQL 服务器支持的字符集在 第 23.3.1 节 中进行了描述。请参阅下方了解其他限制。

策略 #

创建新数据库时使用的策略。如果使用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 #

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

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 所拥有的数据库 sales,其默认表空间为 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 语句。数据库等同于目录,其创建是由实现定义的。

另请参见

ALTER DATABASEDROP DATABASE