CREATE DATABASE

Name

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 权限来创建数据库。参阅 See 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 DATABASEPostgres 语言的扩展.

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

程序 createdb 是 是这个命令的 shell 脚本的封装,提供来方便使用。

在用绝对路径指定的可选数据库位置时, 有一些安全和数据完整性的问题, 而且缺省时只有后端识别的环境变量可以声明为可选的路径. 参考管理员手册获取更多的信息.

尽管我们可以通过把某数据库名声明为模板从非 template1 数据库 拷贝数据库,但是这(还)不是一个通用的 COPY DATABASE 功能. 特别是它的实质是拷贝操作过程中源数据库是空闲状态的 (没有数据更改事务在处理). CREATE DATABASE 会在开始操作的时候检查是否有除它之外的进程 与源数据库相连,不过这样并不能保证在拷贝数据的时候不会发生修改. 因此,我们建议当做模板使用的数据库应该以只读方式对待.

pg_database 里有用于每个数据库的有用的 标志:datistemplatedatallowconn. 可以把 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 语句. 数据库等同于目录,其创建是由实现决定的.