↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1 / 7.0 / 6.5 / 6.4
历史版本PostgreSQL 7.1 已于 2006 年 4 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

CREATE DATABASE

CREATE DATABASE — 创建一个新数据库

大纲

CREATE DATABASE name
    [ WITH [ LOCATION = 'dbpath' ]
           [ TEMPLATE = template ]
           [ ENCODING = encoding ] ]
  

输入

name

要创建的数据库的名称。

dbpath

存储新数据库的备选文件系统位置, 以字符串字面量的形式指定; 或者 DEFAULT 表示使用默认位置。

template

创建新数据库所用模板的名称, 或者 DEFAULT 表示使用默认模板 (template1)。

encoding

在新数据库中使用的多字节编码方法。指定 一个字符串字面量名称(例如 'SQL_ASCII')、 一个整数编码号,或者 DEFAULT 表示使用默认编码。

输出

CREATE DATABASE

命令成功完成时返回的消息。

ERROR: user 'username' is not allowed to create/drop databases

你必须拥有特殊的 CREATEDB 权限才能创建数据库。 见 CREATE USER 。

ERROR: createdb: database "name" already exists

如果已经存在一个具有所指定 name 的数据库,就会出现这个错误。

ERROR: database path may not contain single quotes

数据库位置 dbpath 不能包含 单引号。这是为了确保创建数据库目录的 shell 命令能够安全执行而要求的。

ERROR: CREATE DATABASE: may not be called in a transaction block

如果有一个显式的事务块正在进行中,你就不能调用 CREATE DATABASE。必须先完成该事务。

ERROR: Unable to create database directory 'path'.
ERROR: Could not initialize database directory.

这些错误很可能与数据目录上的权限不足、磁盘已满或其他文件系统问题有关。运行 数据库服务器的用户必须能访问该位置。

描述

CREATE DATABASE 创建一个新的 Postgres 数据库。 创建者成为新数据库的拥有者。

可以指定一个备选位置,例如, 把数据库存储在另一块磁盘上。 该路径必须已经用 initlocation 命令准备好。

如果路径名不包含斜杠,它会被解释为一个环境变量名,服务器进程 必须知道这个变量。这样数据库管理员就可以 控制可以在哪些位置创建数据库。 (惯例的选择例如 'PGDATA2'。) 如果服务器编译时带 ALLOW_ABSOLUTE_DBPATHS (默认不带),那么以 前导斜杠 标识的绝对路径名(例如 '/usr/local/pgsql/data') 也是允许的。

默认情况下,新数据库将通过克隆标准 系统数据库 template1 来创建。可以通过写成 TEMPLATE = name 指定其他模板。特别是, 写成 TEMPLATE = template0 时,可以创建一个全新的数据库, 它只包含你的 Postgres 版本预定义的标准对象。如果你希望避免复制 任何可能已添加到 template1 中的安装本地对象, 这会很有用。

可选的编码参数允许选择数据库编码(如果你的服务器 编译时带了多字节编码支持)。未 指定时,它默认为所选模板 数据库使用的编码。

可选参数可以按任意顺序书写,而不只是按上面 展示的顺序。

注意

CREATE DATABASE 是一种 Postgres 语言扩展。

使用 DROP DATABASE 删除一个数据库。

程序 createdb 是 围绕这个命令的 shell 脚本包装,为方便起见提供。

使用以绝对路径名指定的备选数据库位置会涉及 安全和数据完整性问题,默认情况下, 只有后端已知的环境变量才能被 指定为备选位置。 更多信息见《管理员指南》。

虽然可以通过把某个数据库的名字指定为模板来复制 template1 以外的数据库,但这(目前)并不是要作为一种通用的 COPY DATABASE 设施。特别地, 至关重要的是,在复制操作期间 源数据库必须是空闲的(没有正在进行的 数据更改事务)。CREATE DATABASE 会检查 在操作开始时除了它自己以外没有后端进程连接到 源数据库,但这并不能保证 在复制进行期间不能做出更改。因此, 我们建议把用作模板的数据库当作只读的。

pg_database 中为每个数据库保留了两个有用的标志: datistemplate 和 datallowconn。datistemplate 可以被设置来指明一个数据库打算用作 CREATE DATABASE 的模板。 如果设置了这个标志,任何拥有 CREATEDB 权限的用户都可以克隆 该数据库;如果未设置,则只有超级用户 和该数据库的拥有者可以克隆它。 如果 datallowconn 为假,那么将不允许到该数据库的新连接(但仅仅把该标志设为假 并不会杀死现有的会话)。template0 数据库通常就这样标记,以防止对它的修改。

用法

创建一个新的数据库:

olly=> create database lusiadas;
   

要在备选区域 ~/private_db 中创建一个新数据库:

$ mkdir private_db
$ initlocation ~/private_db
Creating Postgres database system directory /home/olly/private_db/base
   
$ psql olly
Welcome to psql, the PostgreSQL interactive terminal.
 
Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help on internal slash commands
       \g or terminate with semicolon to execute query
       \q to quit

olly=> CREATE DATABASE elsewhere WITH LOCATION = '/home/olly/private_db';
CREATE DATABASE
   

兼容性

SQL92

SQL92 中没有 CREATE DATABASE 语句。 数据库等价于目录,其创建是 实现定义的。

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。