# 创建数据库

CREATE DATABASE — 创建一个新数据库

# 概要

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

# 描述

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

要创建数据库,您必须是超级用户或具有特殊的创建数据库特权。看创建角色.

默认情况下,将通过克隆标准系统数据库来创建新数据库模板1.可以通过编写指定不同的模板模板 *姓名*.特别是,通过写模板模板0,您可以创建一个仅包含您的 PostgreSQL 版本预定义的标准对象的原始数据库(不存在用户定义对象且系统对象未更改的数据库)。如果您希望避免复制任何可能已添加到的本地安装对象,这将非常有用模板1.

# 参数

姓名

要创建的数据库的名称。

用户名

将拥有新数据库的用户的角色名称,或默认使用默认值(即执行命令的用户)。要创建另一个角色拥有的数据库,您必须是该角色的直接或间接成员,或者是超级用户。

模板

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

编码

要在新数据库中使用的字符集编码。指定一个字符串常量(例如,'SQL_ASCII'),或整数编码数字,或默认使用默认编码(即模板数据库的编码)。PostgreSQL 服务器支持的字符集在第 24.3.1 节.有关其他限制,请参见下文。

语言环境

这是设置的快捷方式LC_COLLATELC_CTYPE立刻。如果指定此项,则不能指定其中任何一个参数。

# 提示

其他区域设置液晶显示器_消息,液晶显示器_货币,液晶显示器_数字, 和液晶显示器_时间不是每个数据库固定的,也不是由该命令设置的。如果你想让它们成为特定数据库的默认值,你可以使用更改数据库...设置.

lc_collat​​e

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

lc_ctype

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

表空间名称

将与新数据库关联的表空间的名称,或默认使用模板数据库的表空间。此表空间将是用于在此数据库中创建的对象的默认表空间。看创建表空间了解更多信息。

允许连接

如果为 false,则没有人可以连接到该数据库。默认为 true,允许连接(受其他机制限制的除外,例如授予/撤销连接)。

限制

可以对该数据库进行多少并发连接。-1(默认)表示没有限制。

是模板

如果为真,那么任何用户都可以克隆这个数据库创建数据库特权;如果为 false(默认值),则只有超级用户或数据库所有者可以克隆它。

可选参数可以按任何顺序编写,而不仅仅是上面说明的顺序。

# 笔记

创建数据库不能在事务块内执行。

“无法初始化数据库目录”这一行的错误很可能与数据目录权限不足、磁盘已满或其他文件系统问题有关。

采用删除数据库删除数据库。

该程序创建数据库是围绕此命令的包装程序,为方便起见而提供。

数据库级配置参数(通过设置更改数据库)和数据库级权限(通过设置授予) 不会从模板数据库中复制。

虽然可以复制除模板1通过将其名称指定为模板,这不是(还)打算作为通用“复制数据库“ 设施。主要限制是在复制模板数据库时没有其他会话可以连接到模板数据库。创建数据库如果启动时存在任何其他连接,则会失败;否则,与模板数据库的新连接将被锁定,直到创建数据库完成。看第 23.3 节了解更多信息。

为新数据库指定的字符集编码必须与所选的区域设置兼容 (LC_COLLATELC_CTYPE)。如果语言环境是C(或等效地POSIX),则允许所有编码,但对于其他语言环境设置,只有一种编码可以正常工作。(但是,在 Windows 上,UTF-8 编码可用于任何语言环境。)创建数据库将允许超级用户指定SQL_ASCII编码与语言环境设置无关,但不推荐使用此选项,如果与语言环境不兼容的数据存储在数据库中,则可能导致字符串函数的错误行为。

编码和区域设置必须与模板数据库的匹配,除非当模板0用作模板。这是因为其他数据库可能包含与指定编码不匹配的数据,或者可能包含排序顺序受以下因素影响的索引LC_COLLATELC_CTYPE.根据新设置,复制此类数据会导致数据库损坏。模板0但是,众所周知,它不包含任何会受到影响的数据或索引。

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

# 例子

要创建一个新数据库:

CREATE DATABASE lusiadas;

创建数据库销售量归用户所有销售应用默认表空间为销售空间

CREATE DATABASE sales OWNER salesapp TABLESPACE salesspace;

创建数据库音乐使用不同的语言环境:

CREATE DATABASE music
    LOCALE 'sv_SE.utf8'
    TEMPLATE template0;

在这个例子中,模板模板0如果指定的语言环境不同于模板1.(如果不是,那么明确指定语言环境是多余的。)

创建数据库音乐2使用不同的语言环境和不同的字符集编码:

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

指定的语言环境和编码设置必须匹配,否则会报错。

请注意,语言环境名称特定于操作系统,因此上述命令可能不会在任何地方以相同的方式工作。

# 兼容性

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

# 也可以看看

更改数据库,删除数据库