数据的组织结构
- 数据库;表,索引;数据行
-
PostgreSQL
中一个服务(实例)可以有多个数据库;而一个数据库不能属于多个实例;
数据库
创建数据库
create database name [owner] [template] [encoding] [tablespace] [connection limit].....
-
owner
指定创建的数据库属于哪个用户;
-
template
指定从哪个模版中创建数据库,默认为template1
;
-
encoding
创建新数据库使用的字符编码;
create databse test encoding 'LATIN1' template template0;
//上面必须使用template0,因为编码与区域设置必须与模版数据库相匹配;template0不包含任何会受字符集编码或排序影响的数据或索引;
修改数据库
alter database test connection limit 10;
//改名
alter databasw test01 rename to test02;
//修改配置参数
alter database test set enable_indexscan to off;
删除数据库
drop database [if exists] name;
模式
- 可以理解为一个命名空间活目录;不同的模式下可以有相同的名称的表,函数等;
-
PostgreSQL
中不能同时访问不同的数据库中的对象;而模式没有此限制;
使用模式的原因
- 允许多个用户在使用同一数据库时彼此互不干扰;
- 把数据库对象放在不同模式下,然后组织成逻辑组,便于管理;
- 第三方应用可以放在不同的模式中,这样就不会和其他对象的名称冲突;
使用
create schema name;
//为test_user用户创建一个同名的模式
create schema authorization test_user;
//创建模式的同时还可以在这个模式下创建一些表的视图
create schema test
create table t1 (id int, title text),
create table t2 (id int, content text)
create view v1 as
select a.id, a.title, b.content from t1 a, t2 b where a.id = b.id;
- 查看:
\dn
- 删除:
drop schema name;
- 修改
//修改名称
alter schema test rename to test1;
//修改属主
alter schema test owner to newowner;
- 查看非当前模式下的所有表:
\d other_schema.*
公共模式
- 实际上创建或访问模式中的对象格式为:
schema_name.table_name
- 通常情况下,创建一个新的数据库时会自动创建一个名为
public
的模式;
模式搜索路径
- 为了简化定位对象,可以通过查找一个搜索路径来判断某个表在哪个模式下;
- 查看当前搜索路径:
show search_path
; 默认为: "$user",public
;
- 修改当前搜索路径:
set search_path to newpath; //当前session中
alter role username set search_path to newpath; //修改权限下数据库的搜索路径
模式的权限
- 一般用户无法访问模式中不属于他们的对象;
- 若要访问,模式的所有者必须在模式上赋予
usage
权限; 创建赋予create
权限;
- 默认情况下每个人在
public
模式在都有create, usage
权限;撤销:
revoke create on schema public from public; //最后一个public指所有用户;
模式的移植
- 在
SQL
标准里,同一个模式里的对象是不能被不同用户所拥有的;有些数据了不允许创建和所有者不同名的模式(oracle);
- 如果在
PostgesSQL
中为每个用户创建一个与用户名同名的模式,那么就能与Oracle
数据库相兼容;
- 在
SQL
标准里没有public
模式概念;为了与其他数据库兼容不应该使用public
模式;
- 有些数据库系统没有模式或通过允许跨数据库访问来提供模式功能(mysql);假设
mysql
实例中有三个数据库,迁移到PostgreSQL
时应该建立三个模式,使其与三个数据库相对应;