CREATE DATABASE
CREATE DATABASE — 创建一个新数据库
大纲
CREATE DATABASEname[ 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_dbCreating Postgres database system directory /home/olly/private_db/base$psql ollyWelcome 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 quitolly=>CREATE DATABASE elsewhere WITH LOCATION = '/home/olly/private_db';CREATE DATABASE
兼容性
SQL92
SQL92 中没有 CREATE DATABASE 语句。数据库等价于目录,其创建是实现定义的。