On this page
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 ] ]
Description
CREATE DATABASE
创建一个新的 PostgreSQL 数据库。
要创建数据库,您必须是超级用户或具有特殊的CREATEDB
特权。参见CREATE ROLE。
默认情况下,将通过克隆标准系统数据库template1
来创建新数据库。可以通过写入TEMPLATE name
来指定其他模板。特别地,通过编写TEMPLATE template0
,您可以创建一个原始数据库,该数据库仅包含您的 PostgreSQL 版本 sched 义的标准对象。如果您希望避免复制任何可能已添加到template1
的安装本地对象,则这很有用。
Parameters
name
- 要创建的数据库的名称。
user_name
- 拥有新数据库的用户的角色名称,或使用
DEFAULT
来使用默认角色(即,执行命令的用户)。要创建另一个角色拥有的数据库,您必须是该角色的直接或间接成员,或者是超级用户。
- 拥有新数据库的用户的角色名称,或使用
template
- 从中创建新数据库的模板的名称,或使用
DEFAULT
来使用默认模板(template1
)。
- 从中创建新数据库的模板的名称,或使用
encoding
- 在新数据库中使用的字符集编码。指定字符串常量(例如
'SQL_ASCII'
),整数编码数字或DEFAULT
以使用默认编码(即模板数据库的编码)。 Section 23.3.1中描述了 PostgreSQL 服务器支持的字符集。有关其他限制,请参见下文。
- 在新数据库中使用的字符集编码。指定字符串常量(例如
lc_collate
- 在新数据库中使用的排序规则(
LC_COLLATE
)。这会影响应用于字符串的排序 Sequences,例如在使用 ORDER BY 的查询中,以及在文本列的索引中使用的 Sequences。默认设置是使用模板数据库的排序规则。有关其他限制,请参见下文。
- 在新数据库中使用的排序规则(
lc_ctype
- 在新数据库中使用的字符分类(
LC_CTYPE
)。这会影响字符的分类,例如下,上和数字。默认值是使用模板数据库的字符分类。有关其他限制,请参见下文。
- 在新数据库中使用的字符分类(
tablespace_name
- 将与新数据库关联的表空间的名称,或
DEFAULT
以使用模板数据库的表空间。该表空间将是用于在此数据库中创建的对象的默认表空间。有关更多信息,请参见CREATE TABLESPACE。
- 将与新数据库关联的表空间的名称,或
allowconn
- 如果为 false,则没有人可以连接到该数据库。默认值为 true,允许连接(除非受到其他机制(例如
GRANT
/REVOKE CONNECT
)的限制)。
- 如果为 false,则没有人可以连接到该数据库。默认值为 true,允许连接(除非受到其他机制(例如
connlimit
- 可以与此数据库构建多少个并发连接。 -1(默认值)表示没有限制。
istemplate
- 如果为 true,则任何具有
CREATEDB
特权的用户都可以克隆此数据库;如果为 false(默认值),则只有超级用户或数据库所有者才能克隆它。
- 如果为 true,则任何具有
可选参数可以以任何 Sequences 编写,而不仅限于上面说明的 Sequences。
Notes
CREATE DATABASE
无法在事务块内执行。
出现“无法初始化数据库目录”的错误很可能与数据目录权限不足,磁盘已满或其他文件系统问题有关。
使用DROP DATABASE删除数据库。
程序createdb是围绕此命令的包装程序,为方便起见而提供。
不会从模板数据库复制数据库级配置参数(通过ALTER DATABASE设置)。
尽管可以通过将其名称指定为模板来复制template1
以外的数据库,但是(尚未)将其用作通用的“ COPY DATABASE
”功能。主要限制是,在复制模板数据库时,无法将其他会话连接到模板数据库。如果CREATE DATABASE
启动时存在任何其他连接,它将失败;否则,将锁定与模板数据库的新连接,直到CREATE DATABASE
完成。有关更多信息,请参见Section 22.3。
为新数据库指定的字符集编码必须与所选的语言环境设置(LC_COLLATE
和LC_CTYPE
)兼容。如果语言环境是C
(或等效地POSIX
),则允许所有编码,但是对于其他语言环境设置,只有一种编码可以正常工作。 (但是,在 Windows 上,UTF-8 编码可与任何语言环境一起使用.)CREATE DATABASE
将允许超级用户指定SQL_ASCII
编码,而与语言环境设置无关,但是不建议使用此选择,并且如果存在以下情况,则可能导致字符串功能出现异常:与语言环境不兼容的编码存储在数据库中。
编码和语言环境设置必须与模板数据库的设置匹配,除非将template0
用作模板。这是因为其他数据库可能包含与指定编码不匹配的数据,或者可能包含其排序 Sequences 受LC_COLLATE
和LC_CTYPE
影响的索引。复制此类数据将导致数据库根据新设置损坏。但是,已知template0
不包含任何会受到影响的数据或索引。
CONNECTION LIMIT
选项仅强制执行;如果两个新会话大约在同一时间开始,而数据库仅剩下一个连接“插槽”,则这两个会话都可能失败。同样,对超级用户或后台工作人员进程也没有强制执行此限制。
Examples
要创建一个新的数据库:
CREATE DATABASE lusiadas;
创建用户salesapp
拥有的数据库sales
且其默认表空间为salesspace
:
CREATE DATABASE sales OWNER salesapp TABLESPACE salesspace;
要创建具有不同语言环境的数据库music
,请执行以下操作:
CREATE DATABASE music
LC_COLLATE 'sv_SE.utf8' LC_CTYPE 'sv_SE.utf8'
TEMPLATE template0;
在此示例中,如果指定的语言环境与template1
中的语言环境不同,则需要TEMPLATE template0
子句。 (如果不是,则显式指定语言环境是多余的.)
要创建具有不同语言环境和不同字符集编码的数据库music2
,请执行以下操作:
CREATE DATABASE music2
LC_COLLATE 'sv_SE.iso885915' LC_CTYPE 'sv_SE.iso885915'
ENCODING LATIN9
TEMPLATE template0;
指定的语言环境和编码设置必须匹配,否则将报告错误。
请注意,语言环境名称是特定于 os 的,因此上述命令可能无法在所有地方以相同的方式起作用。
Compatibility
SQL 标准中没有CREATE DATABASE
语句。数据库等同于目录,目录的创建是实现定义的。