表空间
在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();