目录
在一个PostgreSQL数据库系统中,数据的组织结构可以分为以下三层:
(1)数据库:一个PostgreSQL数据库服务下可以管理多个数据库,当应用连接到一个数据库时,一般只能访问这个数据库中的数据,而不能访问其他数据库中的内容(除非使用dblink 等其他手段)。
(2)表、索引:一个数据库中有很多表、索引。一般,在 PostgreSQL中表的术语为“Relation ”,而在其他数据库中则叫“Table”。
(3)数据行:每张表中有很多行数据。在 PostgreSQL中行的术语一般为“Tuple”,而在其他数据库中则叫“Row”。
创建数据库语句如下:
- CREATE DATABASE name
- [[ WITH ][OWNER[=] user_name ]
- [TEMPLATE [=-] template ]
- [ENCODING [=] encoding ]
- [LC_COLLATE[=]lc_collate ]
- [LC_CTYPE[=]lc_ctype ]
- [TABLESPACE [=] tablespace ]
- [CONNECTION LIMIT [=]connlimit ]]
一般情况下创建语句,不需要上面那么多的参数,简单的创建数据库的语句如下:
create database osdbadb;
修改数据库的方法如下:
ALTER DATABASE name [ [ WITH ] option [ ... ] ]
这里的option可以是:
- CONNECTION LIMIT connlimit
- ALTER DATABASE name RENAME TO new_nameALTER DATABASE name OWNER TO new_owner
- 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
示例1:改变数据库testdb01的最大连接数为10。
- postgres=# alter database testdb01 CONNECTION LIMIT 10;
- ALTER DATABASE
示例2:改变数据库testdb01的名称为mydb01。
- postgres=# alter database testdb01 rename to mydb01;
- ALTER DATABASE
示例3:改变数据库testdb01的配置参数,让用户一连接到这个用户时,某个配置参数就设置为一个指定的值。比如,关闭在数据库testdb01上的默认索引扫描,命令如下:
ALTER DATABASE testdb01 SET enable_indexscan To off;
删除数据库的命令比较简单,格式如下:
DROP DATABASE [IF EXISTS ] name
示例1:直接删除一个数据库mytestdb01。
- osdba-# drop database mytestdb01;
- DROP DATABASE
示例2:如果一个数据库存在,则将其删除,如果不存在,使用删除命令时也不报错。
- osdba=# drop database if exists mytestdb01 ;
- NOTICE:database "mytestdb01" does not exist, skipping
- DROP DATABASE
注意:如果还有人连接在这个数据库上,将不能删除该数据库,如下:
- osdba=# drop database inytestdb01;
- ERROR:database "mytestdb01" is being accessed by other users
- DETAIL:There is 1 other session using the database.
问题一:能否在事务块中删除数据库?
答:不能,情形如下。
- osdba=# create database mytestdb02;
- ERROR: CREATE DATABASE cannot run inside a transaction block
- STATEMENT:create database mytestdb02;
- ERROR: CREATE DATABASE cannot run inside a transaction block
- osdba=#create database mytestdb01 ;
- CREATE DATABASE
- osdba=# begin;
- BEGIN .
- osdba=# drop database mytestdb01;
- ERROR:DROP DATABASE cannot run inside a transaction block
- STATEMENT:drop database mytestdb01;
- ERROR:DROP DATABASE cannot run inside a transaction block
问题二:能否在事务块中修改数据库?
答:可以,示例如下。
- osdba=# begin;
- BEGIN
- osdba=# alter database mytestdb0l rename to mydb01;
- ALTER DATABASE
- osdba=#rollback;
- ROLLBACK