选择 打开 改范围 完整检索页
受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10
当前 PostgreSQL 版本不在支持生命周期内。
您可以参阅当前版本的对应页面,或其他在上面列出的活跃大版本。

CREATE DATABASE

CREATE DATABASE — 创建一个新数据库

Synopsis

CREATE DATABASE name
    [ WITH ] [ OWNER [=] user_name ]
           [ TEMPLATE [=] template ]
           [ ENCODING [=] encoding ]
           [ LC_COLLATE [=] lc_collate ]
           [ LC_CTYPE [=] lc_ctype ]
           [ TABLESPACE [=] tablespace_name ]
           [ ALLOW_CONNECTIONS [=] allowconn ]
           [ CONNECTION LIMIT [=] connlimit ]
           [ IS_TEMPLATE [=] istemplate ]

描述

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

要创建数据库,你必须是超级用户,或者拥有特殊的 CREATEDB 权限。见 CREATE ROLE

默认情况下,新数据库将通过克隆标准系统数据库 template1 来创建。可以通过编写 TEMPLATE name 指定不同的模板。特别地,通过编写 TEMPLATE template0,可以创建一个仅包含由您的 PostgreSQL 版本预定义的标准对象的全新数据库。如果您希望避免复制可能已添加到 template1 的任何安装本地对象,此方法非常有用。

参数

name

要创建的数据库名称。

user_name

新数据库所有者的角色名称,或使用 DEFAULT 以使用默认值(即执行命令的用户)。要创建由其他角色拥有的数据库,您必须是该角色的直接或间接成员,或为超级用户。

template

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

encoding

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

lc_collate

新数据库中使用的排序规则(LC_COLLATE)。这会影响字符串的排序顺序,例如在带有 ORDER BY 的查询中,以及文本列索引中使用的顺序。默认值是使用模板数据库的排序规则。请参见下文的其他限制。

lc_ctype

新数据库中使用的字符分类(LC_CTYPE)。这会影响字符的分类,例如小写、大写和数字。默认值是使用模板数据库的字符分类。请参见下文的其他限制。

tablespace_name

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

allowconn

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

connlimit

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

istemplate

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

可选参数可以按任意顺序书写,不一定要按照上面的顺序。

注解

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

形如 could not initialize database directory 的错误, 多半与数据目录权限不足、磁盘已满或其他文件系统问题有关。

使用 DROP DATABASE 删除数据库。

程序 createdb 是这个命令的一个包装器程序,为方便使用而提供。

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

尽管可以通过把某个数据库名指定为模板,从而复制它而不是复制 template1,但这(至少目前)并不打算作为一种通用的 COPY DATABASE 功能。主要限制是,在复制模板数据库期间,不能有任何其他会话连接到该数据库。 CREATE DATABASE 在启动时如果发现存在任何其他连接,就会失败;否则,在 CREATE DATABASE 完成之前,将阻止对模板数据库建立新的连接。详见 Section 22.3

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

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

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

示例

要创建一个新数据库:

CREATE DATABASE lusiadas;

要创建数据库sales,其所有者为用户 salesapp,默认表空间为 salesspace

CREATE DATABASE sales OWNER salesapp TABLESPACE salesspace;

要创建数据库music,使用不同的区域设置:

CREATE DATABASE music
    LC_COLLATE 'sv_SE.utf8' LC_CTYPE 'sv_SE.utf8'
    TEMPLATE template0;

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

要创建数据库music2,使用不同的区域设置和不同的字符集编码:

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

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

请注意,区域设置名称是特定于操作系统的,因此上述命令未必在所有环境中都以相同方式工作。

兼容性

SQL 标准中没有 CREATE DATABASE 语句。数据库相当于目录,而目录的创建由实现定义。