在postgresql中,如果创建视图后,需要修改基础表,会出现一些问题。

基础表和视图
  1. postgres=# create table cstech(age int, name varchar(10), class int);
  2. CREATE TABLE
  3. # 这里我们采用select * 来选择所有字段
  4. postgres=# create view cs_v as select * from cstech;
  5. CREATE VIEW
  6. postgres=# insert into cstech values(22, 'lxcos', 1);
  7. INSERT 0 1
  8. # 可以发现使用select *获取到的字段其实在创建视图的时候内部已经转换成了对应的字段名称
  9. postgres=# select * from cs_v;
  10. age | name | class
  11. -----+-------+-------
  12. 22 | lxcos | 1
  13. (1 row)
添加字段的测试
  1. postgres=# alter table cstech add column school text;
  2. ALTER TABLE
  3. postgres=# select * from cs_v;
  4. age | name | class
  5. -----+-------+-------
  6. 22 | lxcos | 1
  7. (1 row)

针对上面的select * 创建的视图获取到基础表的所有字段内容,我们做一个测试,不难发现在基础表上新增字段后,对已建的视图是没有影响的,新的字段内容并不会自动添加到视图上。

修改字段类型(视图引用的字段)
  1. postgres=# alter table cstech alter column class type text;
  2. ERROR: cannot alter type of a column used by a view or rule
  3. DETAIL: rule _RETURN on view cs_v depends on column "class"

对于被视图引用的字段,是不允许被修改类型的,如果需要修改类型,需要先删掉视图,修改后再重建视图。

修改字段名(视图引用的字段)
  1. postgres=# alter table cstech rename class to class_info;
  2. ALTER TABLE
  3. postgres=# select * from cs_v;
  4. age | name | class
  5. -----+-------+-------
  6. 22 | lxcos | 1
  7. (1 row)

可以看到修改基础表的字段名,对应视图的的字段名称没有自动同步过来,是没有生效的。

修改字段长度 (视图引用的字段)
  1. postgres=# alter table cstech alter column name type varchar(20);
  2. ERROR: cannot alter type of a column used by a view or rule
  3. DETAIL: rule _RETURN on view cs_v depends on column "name"

同样,被视图引用的字段,是不允许被修改字段长度的。

除了以上所提到的问题,还有其他的内容,欢迎遇到问题的pger前来补充。

0 评论  
添加一条新评论