PG命令之CREATE DATABASE、ALTER DATABASE和DROP DATABASE
Tags: ALTER DATABASECREATE DATABASEDROP DATABASEPG命令介绍
CREATE DATABASE
CREATE DATABASE — 创建一个新数据库
大纲
1 2 3 4 5 6 7 8 9 10 11 | CREATE DATABASE name [ [ WITH ] [ OWNER [=] user_name ] [ TEMPLATE [=] template ] [ ENCODING [=] encoding ] [ LOCALE [=] locale ] [ LC_COLLATE [=] lc_collate ] [ LC_CTYPE [=] lc_ctype ] [ TABLESPACE [=] tablespace_name ] [ ALLOW_CONNECTIONS [=] allowconn ] [ CONNECTION LIMIT [=] connlimit ] [ IS_TEMPLATE [=] istemplate ] ] |
描述
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_COLLATE
和LC_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_COLLATE
和LC_CTYPE
)相兼容。如果区域是C
(或者等效的POSIX
),那么所有编码都被允许,但是对于其他区域设置只有一种编码能正确工作(不过,在 Windows 上 UTF-8 编码能够与任何区域一起使用)。CREATE DATABASE
将允许超级用户指定SQL_ASCII
编码而不管区域设置,但是这种选择已被废弃并且可能在数据与数据库中存储的区域不是编码兼容时让字符串函数行为失当。
编码和区域设置必须匹配模板数据的编码和区域,除非template0
被用作模板。这是因为其他数据库可能包含不匹配指定编码的数据,或者可能包含排序顺序受LC_COLLATE
和LC_CTYPE
影响的索引。拷贝这种数据将导致一个由于该新设置损坏的数据库。不过,template0
是不会含有任何可能被影响的数据或索引的。
CONNECTION LIMIT
选项大概是唯一会被强制的,如果两个新会话在大约同一时间开始并且那时该数据库只剩有一个连接“槽”,可能两者都会失败。还有,该限制对超级用户或后台工作进程无效。
例子
要创建一个新数据库:
1 | CREATE DATABASE lusiadas; |
要在一个默认表空间salesspace
中创建一个被用户salesapp
拥有的新数据库sales
:
1 | CREATE DATABASE sales OWNER salesapp TABLESPACE salesspace; |
要用不同的语言环境创建数据库music
:
1 2 3 | CREATE DATABASE music LOCALE 'sv_SE.utf8' TEMPLATE template0; |
在这个例子中,如果指定的语言环境与template1
中的语言环境不同, 则需要TEMPLATE template0
子句。(如果不是,则明确指定区域设置是多余的。)
要用不同的语言环境和不同的字符集编码创建数据库music2
:
1 2 3 4 | CREATE DATABASE music2 LOCALE 'sv_SE.iso885915' ENCODING LATIN9 TEMPLATE template0; |
指定的区域设置和编码设置必须匹配,否则会报告错误。
请注意,区域名称是特定于操作系统的, 因此上述命令可能无法在任何地方以相同的方式工作。
兼容性
在 SQL 标准中没有CREATE DATABASE
语句。数据库等效于目录,而目录的创建由实现定义。
ALTER DATABASE
ALTER DATABASE — 更改一个数据库
大纲
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | ALTER DATABASE name [ [ WITH ] option [ ... ] ] 这里 option 可以是: ALLOW_CONNECTIONS allowconn CONNECTION LIMIT connlimit IS_TEMPLATE istemplate ALTER DATABASE name RENAME TO new_name ALTER DATABASE name OWNER TO { new_owner | CURRENT_USER | SESSION_USER } ALTER DATABASE name SET TABLESPACE new_tablespace ALTER DATABASE name SET configuration_parameter { TO | = } { value | DEFAULT } ALTER DATABASE name SET configuration_parameter FROM CURRENT ALTER DATABASE name RESET configuration_parameter ALTER DATABASE name RESET ALL |
描述
ALTER DATABASE
更改一个数据库的属性。
第一种形式更改某些针对每个数据库的设置(详见下文)。只有数据库拥有者或者超级用户可以更改这些设置。
第二种形式更改数据库的名称。只有数据库拥有者或者超级用户可以重命名一个数据库,非超级用户拥有者还必须拥有CREATEDB
特权。当前数据库不能被重命名(如果你需要这样做请连接到一个不同的数据库)。
第三种形式更改数据库的拥有者。要修改拥有者,你必须拥有该数据库并且也是新拥有角色的一个直接或间接成员,并且你必须具有CREATEDB
特权(注意超级用户自动拥有所有这些特权)。
第四种形式更改数据库的默认表空间。只有数据库拥有者或超级用户能够这样做,你还必须对新表空间具有创建特权。这个命令会在物理上移动位于该数据库旧的默认表空间中的任何表或索引到新的表空间中。新的默认表空间对于这个数据库必须是空的,并且不能有人可以连接到该数据库。在非默认表空间中的表和索引不受影响。
剩下的形式更改用于一个PostgreSQL数据库的运行时配置变量的会话默认值。接下来只要一个新的会话在该数据库中开始,指定的值就会成为该会话的默认值。数据库相关的默认值会覆盖出现在postgresql.conf
中或者从postgres
命令行接收到的设置。只有数据库拥有者或超级用户可以更改一个数据库的会话默认值。一些变量不能用这种方式设置或者只能由超级用户更改。
参数
name
要被修改属性的数据库名称。
allowconn
如果为假,则没有人能连接到这个数据库。
connlimit
与这个数据库可以建立多少个并发连接。-1 表示没有限制。
istemplate
如果为真,则任何具有
CREATEDB
特权的用户都可以从这个数据库进行克隆。如果为假,则只有超级用户或者这个数据库的拥有者可以克隆它。new_name
数据库的新名称。
new_owner
数据库的新拥有者。
new_tablespace
数据库的新默认表空间。这种形式的命令不能在事务块内执行。
configuration_parameter
value
将这个数据库的指定配置参数的会话默认值设置为给定值。如果
value
是DEFAULT
,或者等效地使用了RESET
,数据库相关的设置会被移除,因此系统范围的默认设置将会在新会话中继承。使用RESET ALL
可清除所有数据库相关的设置。SET FROM CURRENT
会保存该会话的当前参数值作为数据库相关的值。更多关于允许的参数名称和值的信息可参考SET和第 19 章。
注解
也可以把一个会话的默认值绑定到一个特定角色而不是一个数据库,见ALTER ROLE。如果有冲突,角色相关的设置会覆盖数据库相关的值。
例子
要在数据库test
中默认禁用索引扫描:
1 | ALTER DATABASE test SET enable_indexscan TO off; |
兼容性
ALTER DATABASE
语句是一个PostgreSQL扩展。
DROP DATABASE
DROP DATABASE — 移除一个数据库
大纲
1 2 3 4 5 | DROP DATABASE [ IF EXISTS ] name [ [ WITH ] ( option [, ...] ) ] 其中选项 可以是: FORCE |
描述
DROP DATABASE
移除一个数据库。它会 移除该数据库的系统目录项并且删除包含数据的文件目录。它只能由数据库 拥有者执行。当你已经连接到目标数据库时,它不能被执行(连接 到postgres
或者任何其他数据库来发出这个命令)。 另外,如果其他任何人已经连接到目标数据库,这个命令将会失败,除非您 使用以下所述的FORCE
选项。
DROP DATABASE
不能被撤销。请小心使用!
参数
IF EXISTS
如果该数据库不存在则不要抛出一个错误,而是发出一个提示。
name
要移除的数据库的名称。
FORCE
尝试终止与目标数据库的所有现有连接。 如果目标数据库中存在准备好的事务、活跃的逻辑复制槽或订阅,则不会终止。如果当前用户没有终止其他连接的权限,则此操作将失败。所需权限与 第 9.27.2 节中描述的
pg_terminate_backend
相同。如果我们不能 终止连接,则此操作也将会失败。
注解
DROP DATABASE
不能在一个事务块内执行。
在连接到目标数据库时,这个命令不能被执行。因此,使用程序 dropdb会更方便,它是这个命令的一个包装器。
兼容性
SQL 标准中没有DROP DATABASE
语句。
可以在事务块中修改数据库,但是不能在事务块中删除数据库!