天天看点

PG基础篇--逻辑结构管理(表空间、视图)

表空间

在PG中,表空间实际是为表指定一个存储目录,在创建数据库时可以为其指定默认的表空间。创建表、索引也可以指定表空间,这样表,索引,就可以存储到表空间对应的目录下了。

创建表空间

create tablespace tbs_data location '/opt/data/';      

在创建数据库时可以指定默认的表空间,这样以后此数据库中创建表,索引时就可以自动存储到表空间指定的目录下

指定默认表空间

create database db01 tablespace tbs_data;      

修改默认表空间

修改数据库的默认表空间,执行该命令,不能有用户连接到这个数据库上,否则会报错。

alter database db02 set tablespace tbs_data;      

改变表的默认表空间时,数据库中已有表的表空间不会改变。

指定表空间

创建表或者索引或约束指定表空间

postgres=# create table test02(id int,note text) tablespace tbs_data;
CREATE TABLE
postgres=# create index idx_test02 on test02(id) tablespace tbs_data;
CREATE INDEX
postgres=# alter table test02 add constraint unique_test02_id unique(id) USING INDEX TABLESPACE tbs_data;
ALTER TABLE
postgres=# alter table test02 add constraint pk_test02_id primary key(id) USING INDEX tablespace tbs_data;
ALTER TABLE      

移动表所在表空间

postgres=# alter table test02 set tablespace pg_default;
ALTER TABLE      

在移动表的时候表会被锁定,对此表的所有操作都将无法执行,包括select操作。

视图

视图就是由查询语句定义的虚拟表。

创建视图

CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] [ RECURSIVE ] VIEW name [ ( column_name [, ...] ) ]
    [ WITH ( view_option_name [= view_option_value] [, ... ] ) ]
    AS query
    [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]      
create view vw_user AS select id,user_name,user_email from users;      

如果使用了TEMP或者TEMPORARY关键字,则session结束,这张视图也会消失。

视图修改各列定义

create VIEW vm_user(no,name,email,mark) AS select id,user_name,user_email,user_mark from users;      

可更新视图

 从9.1版本开始,可以通过INSTEAD OF的触发器来实现视图更新

create trigger insert_vw_users_trigger
INSTEAD OF insert on vm_users
for each row execute procedure vm_users_insert_trigger();

create trigger update_vw_users_trigger
INSTEAD OF update on vm_users
for each row execute procedure vm_users_insert_trigger();

create trigger delete_vw_users_trigger
INSTEAD OF delete on vm_users
for each row execute procedure vm_users_insert_trigger();