=============== CREATE DATABASE =============== .. container:: refentry :name: SQL-CREATEDATABASE .. container:: titlepage .. container:: refnamediv .. rubric:: CREATE DATABASE :name: create-database CREATE DATABASE — 创建一个新数据库 .. container:: refsynopsisdiv .. rubric:: 大纲 :name: 大纲 .. code:: 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 ] ] .. container:: refsect1 :name: id-1.9.3.61.5 .. rubric:: 描述 :name: 描述 ``CREATE DATABASE``\ 创建一个新的PostgreSQL数据库。 要创建一个数据库,你必须是一个超级用户或者具有特殊的\ ``CREATEDB``\ 特权。见\ `CREATE ROLE `__\ 。 默认情况下,新数据库将通过克隆标准系统数据库\ ``template1``\ 被创建。可以通过写\ ``TEMPLATE name``\ 指定一个不同的模板。特别地,通过写\ ``TEMPLATE template0``\ 你可以创建一个干净的数据库,它将只包含你的PostgreSQL版本所预定义的标准对象。如果你希望避免拷贝任何可能被加入到\ ``template1``\ 中的本地安装对象,这将有所帮助。 .. container:: refsect1 :name: id-1.9.3.61.6 .. rubric:: 参数 :name: 参数 .. container:: variablelist *``name``* 要创建的数据库名。 *``user_name``* 将拥有新数据库的用户的角色名,或者用\ ``DEFAULT``\ 来使用默认值(即,执行该命令的用户)。要创建一个被另一个角色拥有的数据库,你必须是该角色的一个直接或间接成员,或者是一个超级用户。 *``template``* 要从其创建新数据库的模板名称,或者用\ ``DEFAULT``\ 来使用默认模板(\ ``template1``\ )。 *``encoding``* 要在新数据库中使用的字符集编码。指定一个字符串常量(例如\ ``'SQL_ASCII'``\ ),或者一个整数编码编号,或者\ ``DEFAULT``\ 来使用默认的编码(即,模板数据库的编码)。 *``lc_collate``* 要在新数据库中使用的排序规则顺序(\ ``LC_COLLATE``\ )。这会影响应用到字符串的排序顺序,例如在带 ORDER BY 的查询中,以及文本列上索引所使用的顺序。默认是使用模板数据库的排序规则顺序。附加限制见下文。 *``lc_ctype``* 要在新数据库中使用的字符分类(\ ``LC_CTYPE``\ )。这会影响字符的类别,如小写、大写和数字。默认是使用模板数据库的字符分类。附加限制见下文。 *``tablespace_name``* 将与新数据库相关联的表空间名称,或者\ ``DEFAULT``\ 来使用模板数据库的表空间。这个表空间将是在这个数据库中创建的对象的表空间。详见\ `CREATE TABLESPACE `__\ 。 *``allowconn``* 如果为假,则没有人能连接到这个数据库。默认为真,表示允许连接(除了 被其他机制约束以外,例如\ ``GRANT``/``REVOKE CONNECT``\ )。 *``connlimit``* 这个数据库允许多少并发连接。-1 (默认值)表示没有限制。 *``istemplate``* 如果为真,则任何具有\ ``CREATEDB``\ 特权的用户都可以从 这个数据库克隆。如果为假(默认),则只有超级用户或者该数据库的拥有者 可以克隆它。 可选的参数可以被写成任何顺序,不用按照上面说明的顺序。 .. container:: refsect1 :name: id-1.9.3.61.7 .. rubric:: 注解 :name: 注解 ``CREATE DATABASE``\ 不能在一个事务块内被执行。 带有一行“不能初始化数据库目录”的错误大部分与在数据目录上权限不足、磁盘满或其他文件系统问题有关。 使用\ `DROP DATABASE `__\ 移除一个数据库。 程序\ `createdb `__\ 是这个命令的一个包装器程序,为了使用方便而提供。 不会从模板数据库中复制数据库层面的配置参数(通过\ `ALTER DATABASE `__\ 设置)。 尽管可以通过指定一个数据库作为模板来从其中而不是\ ``template1``\ 复制,这(还)不是“\ ``COPY DATABASE``\ ”功能的一般目的。主要的限制是在模板数据库被拷贝期间其他会话不能连接到它。如果\ ``CREATE DATABASE``\ 启动时还存在任何其他连接,它将失败。否则,到模板数据库的新连接将被挡在外面直到\ ``CREATE DATABASE``\ 完成。 为新数据库指定的字符集编码必须与选定的区域设置(\ ``LC_COLLATE``\ 和\ ``LC_CTYPE``\ )相兼容。如果区域是\ ``C``\ (或者等效的\ ``POSIX``\ ),那么所有编码都被允许,但是对于其他区域设置只有一种编码能正确工作(不过,在 Windows 上 UTF-8 编码能够与任何区域一起使用)。\ ``CREATE DATABASE``\ 将允许超级用户指定\ ``SQL_ASCII``\ 编码而不管区域设置,但是这种选择已被废弃并且可能在数据与数据库中存储的区域不是编码兼容时让字符串函数行为失当。 编码和区域设置必须匹配模板数据的编码和区域,除非\ ``template0``\ 被用作模板。这是因为其他数据库可能包含不匹配指定编码的数据,或者可能包含排序顺序受\ ``LC_COLLATE``\ 和\ ``LC_CTYPE``\ 影响的索引。拷贝这种数据将导致一个由于该新设置损坏的数据库。不过,\ ``template0``\ 是不会含有任何可能被影响的数据或索引的。 ``CONNECTION LIMIT``\ 选项大概是唯一会被强制的,如果两个新会话在大约同一时间开始并且那时该数据库只剩有一个连接“槽”,可能两者都会失败。还有,该限制对超级用户或后台工作进程无效。 .. container:: refsect1 :name: id-1.9.3.61.8 .. rubric:: 例子 :name: 例子 要创建一个新数据库: .. code:: programlisting CREATE DATABASE lusiadas; 要在一个默认表空间\ ``salesspace``\ 中创建一个被用户\ ``salesapp``\ 拥有的新数据库\ ``sales``\ : .. code:: programlisting CREATE DATABASE sales OWNER salesapp TABLESPACE salesspace; 要用不同的语言环境创建数据库\ ``music``\ : .. code:: programlisting CREATE DATABASE music LC_COLLATE 'sv_SE.utf8' LC_CTYPE 'sv_SE.utf8' TEMPLATE template0; 在这个例子中,如果指定的语言环境与\ ``template1``\ 中的语言环境不同, 则需要\ ``TEMPLATE template0``\ 子句。(如果不是,则明确指定区域设置是多余的。) 要用不同的语言环境和不同的字符集编码创建数据库\ ``music2``\ : .. code:: programlisting CREATE DATABASE music2 LC_COLLATE 'sv_SE.iso885915' LC_CTYPE 'sv_SE.iso885915' ENCODING LATIN9 TEMPLATE template0; 指定的区域设置和编码设置必须匹配,否则会报告错误。 请注意,区域名称是特定于操作系统的, 因此上述命令可能无法在任何地方以相同的方式工作。 .. container:: refsect1 :name: id-1.9.3.61.9 .. rubric:: 兼容性 :name: 兼容性 在 SQL 标准中没有\ ``CREATE DATABASE``\ 语句。数据库等效于目录,而目录的创建由实现定义。 .. container:: refsect1 :name: id-1.9.3.61.10 .. rubric:: 参见 :name: 参见 `ALTER DATABASE `__, `DROP DATABASE `__