Postgresql 文档在这一点上很清楚:您不能更改现有视图的列。
新查询必须生成与现有视图查询相同的列(即,相同的列名以相同的顺序和相同的数据类型)(...)
参考:http ://www.postgresql.org/docs/9.3/static/sql-createview.html
为什么我必须放弃视图或更改它来修改它?
Postgresql 文档在这一点上很清楚:您不能更改现有视图的列。
新查询必须生成与现有视图查询相同的列(即,相同的列名以相同的顺序和相同的数据类型)(...)
参考:http ://www.postgresql.org/docs/9.3/static/sql-createview.html
为什么我必须放弃视图或更改它来修改它?
这是一个实施限制。当然,理论上这是可能的,但还没有人编写代码来处理它。
为了处理列删除或类型更改,PostgreSQL 必须扫描引用正在修改的视图的每个视图(使用
pg_catalog.pg_depend
),以查看它们中的任何一个是否依赖于该列。它还需要查找整行引用并在这些情况下不允许更改。不太清楚为什么不允许添加列。同样,我怀疑这取决于整行引用。如果
pg_depend
检查了整行引用而没有找到任何引用,并且新列出现在末尾,则可以添加它。但是,使用创建的视图
SELECT * FROM
不会“继承”新列,因为*
在创建视图期间会扩展为列列表。因此,如果您view_A
这样做了SELECT * FROM view_B
,并且您在 中添加了一列view_B
,它就不会出现在view_A
. 但是,如果您删除并重新创建view_A
,该列会出现。不用说,这不好。为了解决这个问题,PostgreSQL 必须跟踪给定视图的列列表(PostgreSQL 内部术语中的“targetlist”)是否来自*
通配符。这比你想象的要复杂,因为你也可以写someview.*
。总而言之——它很复杂,没有人想要它来完成它的工作来实现它。