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 ]
[ 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 服务器支持的字符集在 第 24.3.1 节 中进行了描述。有关其他限制,请参见下文。strategy#用于创建新数据库的策略。如果使用
WAL_LOG策略,则数据库将逐块复制,并且每个块将单独写入预写式日志。在模板数据库较小的情况下,这是最有效的策略,因此它是默认策略。较旧的FILE_COPY策略也可用。此策略为目标数据库使用的每个表空间在预写式日志中写入一条小记录。每条此类记录表示在文件系统级别将整个目录复制到新位置。虽然这确实会大幅减少预写式日志的容量,尤其是在模板数据库较大的情况下,但它还迫使系统在创建新数据库之前和之后都执行检查点。在某些情况下,这可能会对整体系统性能产生明显的负面影响。locale#设置新数据库中的默认排序顺序和字符分类。排序顺序会影响应用于字符串的排序顺序,例如,在使用
ORDER BY的查询中,以及在文本列索引中使用的顺序。字符分类会影响字符的分类,例如,小写、大写和数字。还会设置操作系统环境的关联方面,LC_COLLATE和LC_CTYPE。默认设置与模板数据库的设置相同。有关详细信息,请参见 第 24.2.2.3.1 节 和 第 24.2.2.3.2 节。可以通过分别设置
lc_collate、lc_ctype或icu_locale来覆盖。提示
其他区域设置 lc_messages、lc_monetary、lc_numeric 和 lc_time 不会针对每个数据库进行修复,也不会通过此命令进行设置。如果您想将它们设为特定数据库的默认值,可以使用
ALTER DATABASE ... SET。lc_collate#在数据库服务器的操作系统环境中设置
LC_COLLATE。如果指定了locale,则默认值为locale的设置,否则与模板数据库的设置相同。有关其他限制,请参见下文。如果
locale_provider为libc,还会设置在新数据库中使用的默认排序顺序,覆盖设置locale。lc_ctype#在数据库服务器的操作系统环境中设置
LC_CTYPE。如果指定了locale,则默认值为locale的设置,否则与模板数据库的设置相同。有关其他限制,请参见下文。如果
locale_provider是libc,还将设置在新数据库中使用的默认字符分类,覆盖设置locale。icu_locale#指定 ICU 语言环境(请参阅 第 24.2.2.3.2 节)以获取数据库默认排序顺序和字符分类,覆盖设置
locale。 语言环境提供程序 必须是 ICU。如果指定了locale,则默认值为其设置;否则与模板数据库的设置相同。icu_rules#指定其他排序规则以自定义此数据库的默认排序行为。这仅受 ICU 支持。有关详细信息,请参阅 第 24.2.3.4 节。
locale_provider#指定用于此数据库中默认排序的提供程序。可能的值为
icu(如果服务器已使用 ICU 支持构建)或libc。默认情况下,提供程序与template的提供程序相同。有关详细信息,请参阅 第 24.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完成之前,将锁定到模板数据库的新连接。有关详细信息,请参见第 23.3 节。
为新数据库指定字符集编码必须与所选区域设置(LC_COLLATE和LC_CTYPE)兼容。如果区域设置为C(或等效地设置为POSIX),则允许所有编码,但对于其他区域设置,只有一个编码可以正常工作。(但是,在 Windows 上,UTF-8 编码可与任何区域设置一起使用。)CREATE DATABASE允许超级用户指定SQL_ASCII编码,而不管区域设置如何,但此选择已弃用,并且如果将与区域设置编码不兼容的数据存储在数据库中,可能会导致字符字符串函数出现错误行为。
编码和区域设置必须与模板数据库匹配,但将template0用作模板时除外。这是因为其他数据库可能包含与指定编码不匹配的数据,或者可能包含其排序顺序受LC_COLLATE和LC_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语句。数据库等同于目录,其创建由实现定义。
