PG命令之CREATE DATABASE、ALTER DATABASE和DROP DATABASE

1    662    6

Tags:

👉 本文共约5564个字,系统预计阅读时间或需21分钟。

CREATE DATABASE

CREATE DATABASE — 创建一个新数据库

大纲

描述

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

要创建一个数据库,你必须是一个超级用户或者具有特殊的CREATEDB特权。见CREATE ROLE

默认情况下,新数据库将通过克隆标准系统数据库template1被创建。可以通过写TEMPLATE *name*指定一个不同的模板。特别地,通过写TEMPLATE template0你可以创建一个原始的数据库(其中没有用户定义的对象存在并且系统对象没有被更改),它将只包含你的PostgreSQL版本所预定义的标准对象。如果你希望避免拷贝任何可能被加入到template1中的本地安装对象,这将有所帮助。

参数

  • name

    要创建的数据库名。

  • user_name

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

  • template

    要从其创建新数据库的模板名称,或者用DEFAULT来使用默认模板(template1)。

  • encoding

    要在新数据库中使用的字符集编码。指定一个字符串常量(例如'SQL_ASCII'),或者一个整数编码编号,或者DEFAULT来使用默认的编码(即,模板数据库的编码)。PostgreSQL服务器所支持的字符集在第 23.3.1 节中描述。附加限制见下文。

  • locale

    这是一个同时设置LC_COLLATELC_CTYPE的快捷方式。 如果指定此参数,您不能指定这些参数中的任何一个。提示其他语言环境设置 lc_messages, lc_monetary, lc_numeric, and lc_time不是每个数据库固定的, 也不是由该命令设置的。 如果要将它们设置为特定数据库的默认值,则可以使用 ALTER DATABASE... SET.

  • lc_collate

    要在新数据库中使用的排序规则顺序(LC_COLLATE)。这会影响应用到字符串的排序顺序,例如在带 ORDER BY 的查询中,以及文本列上索引所使用的顺序。默认是使用模板数据库的排序规则顺序。附加限制见下文。

  • lc_ctype

    要在新数据库中使用的字符分类(LC_CTYPE)。这会影响字符的类别,如小写、大写和数字。默认是使用模板数据库的字符分类。附加限制见下文。

  • tablespace_name

    将与新数据库相关联的表空间名称,或者DEFAULT来使用模板数据库的表空间。这个表空间将是在这个数据库中创建的对象的表空间。详见CREATE TABLESPACE

  • allowconn

    如果为假,则没有人能连接到这个数据库。默认为真,表示允许连接(除了 被其他机制约束以外,例如GRANT/REVOKE CONNECT)。

  • connlimit

    这个数据库允许多少并发连接。-1 (默认值)表示没有限制。

  • istemplate

    如果为真,则任何具有CREATEDB特权的用户都可以从 这个数据库克隆。如果为假(默认),则只有超级用户或者该数据库的拥有者 可以克隆它。

可选的参数可以被写成任何顺序,不用按照上面说明的顺序。

注解

CREATE DATABASE不能在一个事务块内被执行。

带有一行“不能初始化数据库目录”的错误大部分与在数据目录上权限不足、磁盘满或其他文件系统问题有关。

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

程序createdb是这个命令的一个包装器程序,为了使用方便而提供。

数据库层面的配置参数(参见ALTER DATABASE)和 数据库级权限(参见GRANT)不会从模板数据库中复制。

尽管可以通过指定一个数据库作为模板来从其中而不是template1复制,这(还)不是“COPY DATABASE”功能的一般目的。主要的限制是在模板数据库被拷贝期间其他会话不能连接到它。如果CREATE DATABASE启动时还存在任何其他连接,它将失败。否则,到模板数据库的新连接将被挡在外面直到CREATE DATABASE完成。详见第 22.3 节

为新数据库指定的字符集编码必须与选定的区域设置(LC_COLLATELC_CTYPE)相兼容。如果区域是C(或者等效的POSIX),那么所有编码都被允许,但是对于其他区域设置只有一种编码能正确工作(不过,在 Windows 上 UTF-8 编码能够与任何区域一起使用)。CREATE DATABASE将允许超级用户指定SQL_ASCII编码而不管区域设置,但是这种选择已被废弃并且可能在数据与数据库中存储的区域不是编码兼容时让字符串函数行为失当。

编码和区域设置必须匹配模板数据的编码和区域,除非template0被用作模板。这是因为其他数据库可能包含不匹配指定编码的数据,或者可能包含排序顺序受LC_COLLATELC_CTYPE影响的索引。拷贝这种数据将导致一个由于该新设置损坏的数据库。不过,template0是不会含有任何可能被影响的数据或索引的。

CONNECTION LIMIT选项大概是唯一会被强制的,如果两个新会话在大约同一时间开始并且那时该数据库只剩有一个连接“槽”,可能两者都会失败。还有,该限制对超级用户或后台工作进程无效。

例子

要创建一个新数据库:

要在一个默认表空间salesspace中创建一个被用户salesapp拥有的新数据库sales

要用不同的语言环境创建数据库music

在这个例子中,如果指定的语言环境与template1中的语言环境不同, 则需要TEMPLATE template0子句。(如果不是,则明确指定区域设置是多余的。)

要用不同的语言环境和不同的字符集编码创建数据库music2

指定的区域设置和编码设置必须匹配,否则会报告错误。

请注意,区域名称是特定于操作系统的, 因此上述命令可能无法在任何地方以相同的方式工作。

兼容性

在 SQL 标准中没有CREATE DATABASE语句。数据库等效于目录,而目录的创建由实现定义。

本人提供Oracle(OCP、OCM)、MySQL(OCP)、PostgreSQL(PGCA、PGCE、PGCM)等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!

ALTER DATABASE

ALTER DATABASE — 更改一个数据库

大纲

描述

ALTER DATABASE更改一个数据库的属性。

第一种形式更改某些针对每个数据库的设置(详见下文)。只有数据库拥有者或者超级用户可以更改这些设置。

第二种形式更改数据库的名称。只有数据库拥有者或者超级用户可以重命名一个数据库,非超级用户拥有者还必须拥有CREATEDB特权。当前数据库不能被重命名(如果你需要这样做请连接到一个不同的数据库)。

第三种形式更改数据库的拥有者。要修改拥有者,你必须拥有该数据库并且也是新拥有角色的一个直接或间接成员,并且你必须具有CREATEDB特权(注意超级用户自动拥有所有这些特权)。

第四种形式更改数据库的默认表空间。只有数据库拥有者或超级用户能够这样做,你还必须对新表空间具有创建特权。这个命令会在物理上移动位于该数据库旧的默认表空间中的任何表或索引到新的表空间中。新的默认表空间对于这个数据库必须是空的,并且不能有人可以连接到该数据库。在非默认表空间中的表和索引不受影响。

剩下的形式更改用于一个PostgreSQL数据库的运行时配置变量的会话默认值。接下来只要一个新的会话在该数据库中开始,指定的值就会成为该会话的默认值。数据库相关的默认值会覆盖出现在postgresql.conf中或者从postgres命令行接收到的设置。只有数据库拥有者或超级用户可以更改一个数据库的会话默认值。一些变量不能用这种方式设置或者只能由超级用户更改。

参数

  • name

    要被修改属性的数据库名称。

  • allowconn

    如果为假,则没有人能连接到这个数据库。

  • connlimit

    与这个数据库可以建立多少个并发连接。-1 表示没有限制。

  • istemplate

    如果为真,则任何具有CREATEDB特权的用户都可以从这个数据库进行克隆。如果为假,则只有超级用户或者这个数据库的拥有者可以克隆它。

  • new_name

    数据库的新名称。

  • new_owner

    数据库的新拥有者。

  • new_tablespace

    数据库的新默认表空间。这种形式的命令不能在事务块内执行。

  • configuration_parameter value

    将这个数据库的指定配置参数的会话默认值设置为给定值。如果valueDEFAULT,或者等效地使用了RESET,数据库相关的设置会被移除,因此系统范围的默认设置将会在新会话中继承。使用RESET ALL可清除所有数据库相关的设置。SET FROM CURRENT会保存该会话的当前参数值作为数据库相关的值。更多关于允许的参数名称和值的信息可参考SET第 19 章

注解

也可以把一个会话的默认值绑定到一个特定角色而不是一个数据库,见ALTER ROLE。如果有冲突,角色相关的设置会覆盖数据库相关的值。

例子

要在数据库test中默认禁用索引扫描:

兼容性

ALTER DATABASE语句是一个PostgreSQL扩展。

DROP DATABASE

DROP DATABASE — 移除一个数据库

大纲

描述

DROP DATABASE移除一个数据库。它会 移除该数据库的系统目录项并且删除包含数据的文件目录。它只能由数据库 拥有者执行。当你已经连接到目标数据库时,它不能被执行(连接 到postgres或者任何其他数据库来发出这个命令)。 另外,如果其他任何人已经连接到目标数据库,这个命令将会失败,除非您 使用以下所述的FORCE选项。

DROP DATABASE不能被撤销。请小心使用!

参数

  • IF EXISTS

    如果该数据库不存在则不要抛出一个错误,而是发出一个提示。

  • name

    要移除的数据库的名称。

  • FORCE

    尝试终止与目标数据库的所有现有连接。 如果目标数据库中存在准备好的事务、活跃的逻辑复制槽或订阅,则不会终止。如果当前用户没有终止其他连接的权限,则此操作将失败。所需权限与 第 9.27.2 节中描述的 pg_terminate_backend相同。如果我们不能 终止连接,则此操作也将会失败。

注解

DROP DATABASE不能在一个事务块内执行。

在连接到目标数据库时,这个命令不能被执行。因此,使用程序 dropdb会更方便,它是这个命令的一个包装器。

兼容性

SQL 标准中没有DROP DATABASE语句。

标签:

头像

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

1 条回复

  1. 头像 小麦苗说道:

    可以在事务块中修改数据库,但是不能在事务块中删除数据库!

发表回复

嘿,我是小麦,需要帮助随时找我哦
  • 18509239930
  • 个人微信

  • 麦老师QQ聊天
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部
返回顶部