最基本的创建数据库的 SQL 语句是
CREATE DATABASE db_name;
mydb=> CREATE DATABASE sakila;
CREATE DATABASE
mydb=> \l
数据库列表
名称 | 拥有者 | 字元编码 | Locale Provider | 校对规则 | Ctype | Locale | ICU Rules | 存取权限
-----------+----------+----------+-----------------+----------+-------+--------+-----------+-----------------------
mydb | haife | UTF8 | libc | zh-CN | zh-CN | | |
postgres | postgres | UTF8 | libc | zh-CN | zh-CN | | |
sakila | haife | UTF8 | libc | zh-CN | zh-CN | | |
template0 | postgres | UTF8 | libc | zh-CN | zh-CN | | | =c/postgres +
| | | | | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | libc | zh-CN | zh-CN | | | =c/postgres +
| | | | | | | | postgres=CTc/postgres
(5 行记录)
删除数据库的 SQL 语句是
DROP DATABASE db_name;
注意无法删除当前使用的数据库.
mydb=> \connect sakila 您现在已经连接到数据库 "sakila",用户 "haife". sakila=> drop database sakila; 错误: 无法删除当前使用的数据库 sakila=> \c mydb 您现在已经连接到数据库 "mydb",用户 "haife". mydb=> drop database sakila; DROP DATABASE mydb=>
PostgreSQL 安装好以后默认附带两个模板数据库:
切记, 任何时候都不要对
如果希望定制自己的模板数据库, 则请基于
对基于
基于某个模板来创建新数据库的基本语法是
CREATE DATABASE my_db TEMPLATE my_template_db;
你可以使用任何一个现存的数据库作为创建新数据库时的模板. 例如: 已经存在数据库 mydb, 尽管 mydb 不是数据库模板, 但仍可以作为被参照数据库用于数据库的创建.
postgres=# CREATE DATABASE new_db TEMPLATE mydb; CREATE DATABASE
此外, 你还可以将某个现存的数据库标记为模板数据库, 对于这种被标记为模板的数据库, PostgreSQL 会禁止对其进行编辑或删除.
任何一个具备 CREATEDB 权限的角色都可以使用这种模板数据库.
postgres=# CREATE DATABASE sakila; CREATE DATABASE
以超级用户身份运行以下 SQL 可使任何数据库成为模板数据库.
UPDATE pg_database SET datistemplate = TRUE WHERE datname='mydb';
postgres=# UPDATE pg_database SET datistemplate=true WHERE datname='sakila'; UPDATE 1
此时无法删除模板数据库, 即使超级用户也不被允许.
postgres=# drop database sakila; 错误: 无法删除模板数据库
若要修改或删除此模板数据库, 则将
postgres=# UPDATE pg_database SET datistemplate=false WHERE datname='sakila'; UPDATE 1 postgres=# drop database sakila; DROP DATABASE postgres=#
schema 可以对数据库中的对象进行逻辑分组管理. schema 可以翻译为架构模式. 可以理解为名称空间.
假设要为一家航空公司设计 IT 系统, 有飞机信息表、日常维护记录表、机组人员信息表、人事信息表、乘客信息表, 则可以建立三个 schema,
另外一种常见的管理 schema 的方法是基于角色的管理. 当系统拥有多个客户端并且每个客户端的数据必须完全隔离时, 这种方法特别合适.
假设你的工作是开发一套“宠物狗信息管理系统”并将该在线系统租赁给宠物狗 SPA 店使用.
通过广告, 现在你有了一些客户, 但该系统的数据库中目前仅用了一张
你的系统必须遵守客户间数据的完全隔离性, 即必须保证一家 SPA 店看不到另一家 SPA 店的宠物狗信息.
为了达到这个要求, 你可以为每家客户都建立一个单独的 schema, 每个 schema 中建立相同的一张 dogs 表. 然后就可以把这些宠物狗的数据从单一的dogs 分散到不同的shema的 dogs 表中.
最后为每个 schema 创建一个与之同名的可登录角色, 这样就可以实现各自独立管理.
命令
postgres=# \dn
架构模式列表
名称 | 拥有者
--------+-------------------
public | pg_database_owner
(1 行记录)
也可以在 information_schema 模式下的 schemata 视图中查询.
SELECT schema_name FROM information_schema.schemata;
postgres=# SELECT schema_name FROM information_schema.schemata;
schema_name
--------------------
public
information_schema
pg_catalog
pg_toast
(4 行记录)
查看一下视图 information_schema.schemata 的结构.
postgres=# \d information_schema.schemata
视图 "information_schema.schemata"
栏位 | 类型 | 校对规则 | 可空的 | 预设
-------------------------------+-----------------------------------+----------+--------+------
catalog_name | information_schema.sql_identifier | | |
schema_name | information_schema.sql_identifier | | |
schema_owner | information_schema.sql_identifier | | |
default_character_set_catalog | information_schema.sql_identifier | | |
default_character_set_schema | information_schema.sql_identifier | | |
default_character_set_name | information_schema.sql_identifier | | |
sql_path | information_schema.character_data | | |
postgres=# \d pg_catalog.pg_namespace
数据表 "pg_catalog.pg_namespace"
栏位 | 类型 | 校对规则 | 可空的 | 预设
----------+-----------+----------+----------+------
oid | oid | | not null |
nspname | name | | not null |
nspowner | oid | | not null |
nspacl | aclitem[] | | |
索引:
"pg_namespace_oid_index" PRIMARY KEY, btree (oid)
"pg_namespace_nspname_index" UNIQUE CONSTRAINT, btree (nspname)
postgres=# SELECT nspname FROM pg_catalog.pg_namespace;
nspname
--------------------
pg_toast
pg_catalog
public
information_schema
(4 行记录)
常用的系统变量有
PostGIS 插件安装好后, 会自动建立几个系统变量, 例如: