百科 / SQL 命令 / 数据库、模式与表空间
SQL COMMAND · 数据库、模式与表空间
CREATE DATABASE
创建一个新数据库
CREATE数据库、模式与表空间引入 10(基线)现存至 20 devel4 次语法变更
- 动词
CREATE- 对象
DATABASE- 引入版本
- 10(基线)
- 状态
- 现存
- 语法变更次数
- 4
- 手册小节数
- 6
版本轨迹
相对 PostgreSQL 17 语法未变,正文有更新。
语法铁道图 PostgreSQL 18
沿轨道从左向右阅读,分岔表示选择,绕行表示可选,回环表示重复。方框为参数,点击带下划线的参数可展开子规则。
语法概要
CREATE DATABASEname[ 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 指定其他模板。特别是,写成 nameTEMPLATE 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_COLLATE和LC_CTYPE。默认值与模板数据库中的设置相同。详见第 23.2.2.3.1 节和第 23.2.2.3.2 节。也可以通过分别设置
lc_collate、lc_ctype、builtin_locale或icu_locale来覆盖它。如果
locale_provider是builtin,则必须指定locale或builtin_locale,并将其设为C、C.UTF-8或PG_UNICODE_FAST之一。提示
其他区域设置参数lc_messages、lc_monetary、lc_numeric和lc_time并不是按数据库固定的,也不会由此命令设置。如果你希望把它们设为某个特定数据库的默认值,可以使用
ALTER DATABASE ... SET。lc_collate在数据库服务器的操作系统环境中设置
LC_COLLATE。默认值为locale的设置(如果已指定),否则与模板数据库中的设置相同。其他限制见下文。如果
locale_provider是libc,它还会设置新数据库中使用的默认排序规则,从而覆盖locale的设置。lc_ctype在数据库服务器的操作系统环境中设置
LC_CTYPE。默认值为locale的设置(如果已指定),否则与模板数据库中的设置相同。其他限制见下文。如果
locale_provider是libc,它还会设置新数据库中使用的默认字符分类,从而覆盖locale的设置。builtin_locale指定用于数据库默认排序规则和字符分类的 builtin 提供程序区域设置,从而覆盖
locale的设置。区域设置提供程序必须是builtin。默认值为locale的设置(如果已指定),否则与模板数据库中的设置相同。builtin提供程序可用的区域设置有C、C.UTF-8和PG_UNICODE_FAST。icu_locale指定 ICU 区域设置(见第 23.2.2.3.2 节),用于数据库默认排序规则和字符分类,从而覆盖
locale的设置。区域设置提供程序必须是 ICU。默认值为locale的设置(如果已指定),否则与模板数据库中的设置相同。icu_rules指定附加的排序规则,用以定制该数据库默认排序规则的行为。该选项仅支持 ICU。详见第 23.2.3.4 节。
locale_provider指定该数据库默认排序规则使用的提供程序。可能的值为
builtin、icu(如果服务器构建时启用了 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 不能在事务块内执行。
形如“could not initialize database directory”的错误,多半与数据目录权限不足、磁盘已满或其他文件系统问题有关。
使用 DROP DATABASE 删除数据库。
程序createdb是这个命令的一个包装器程序,为方便使用而提供。
数据库级配置参数(通过 ALTER DATABASE 设置)以及数据库级权限(通过 GRANT 设置)都不会从模板数据库中复制。
尽管可以通过把某个数据库名指定为模板,从而复制它而不是复制 template1,但这(至少目前)并不打算作为一种通用的“COPY DATABASE”功能。主要限制是,在复制模板数据库期间,不能有任何其他会话连接到该数据库。CREATE DATABASE 在启动时如果发现存在任何其他连接,就会失败;否则,在 CREATE DATABASE 完成之前,将阻止对模板数据库建立新的连接。详见第 22.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 拥有、默认表空间为 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 语句。数据库相当于目录,而目录的创建由实现定义。
另见
语法演化
相邻大版本之间的差异,新的在前。版本号链接到对应快照。
PostgreSQL 20← 19正文更新
正文更新PostgreSQL 19← 18正文更新
正文更新PostgreSQL 18← 17正文更新
正文更新PostgreSQL 17← 16语法变化
+ [ LC_CTYPE [=] lc_ctype ]+ [ BUILTIN_LOCALE [=] builtin_locale ]正文更新PostgreSQL 16← 15语法变化
+ [ ICU_RULES [=] icu_rules ]+ [ LOCALE_PROVIDER [=] locale_provider ]正文更新PostgreSQL 15← 14语法变化
+ [ STRATEGY [=] strategy ]+ [ LOCALE [=] locale ]+ [ LC_CTYPE [=] lc_ctype ]+ [ ICU_LOCALE [=] icu_locale ]+ [ LOCALE_PROVIDER [=] locale_provider ]+ [ COLLATION_VERSION = collation_version ]+ [ OID [=] oid ]正文更新PostgreSQL 14← 13正文更新
正文更新PostgreSQL 13← 12语法变化
+ [ ENCODING [=] encoding ]+ [ LOCALE [=] locale ]正文更新PostgreSQL 11← 10正文更新
正文更新
同组命令
| 命令 | 动词 | 对象 | 版本变动 | 最近变更 |
|---|---|---|---|---|
CREATE DATABASE | CREATE | DATABASE | 174 次 | |
| 创建一个新数据库 | 现存 | |||
ALTER DATABASE | ALTER | DATABASE | 152 次 | |
| 更改一个数据库 | 现存 | |||
DROP DATABASE | DROP | DATABASE | 131 次 | |
| 移除一个数据库 | 现存 | |||
CREATE SCHEMA | CREATE | SCHEMA | 141 次 | |
| 定义一个新模式 | 现存 | |||
ALTER SCHEMA | ALTER | SCHEMA | 141 次 | |
| 更改一个模式的定义 | 现存 | |||
DROP SCHEMA | DROP | SCHEMA | — | |
| 移除一个模式 | 现存 | |||
CREATE TABLESPACE | CREATE | TABLESPACE | 141 次 | |
| 定义一个新表空间 | 现存 | |||
ALTER TABLESPACE | ALTER | TABLESPACE | 141 次 | |
| 更改一个表空间的定义 | 现存 | |||
DROP TABLESPACE | DROP | TABLESPACE | — | |
| 移除一个表空间 | 现存 | |||