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 内部术语中的“目标列表”)是否来自*
通配符。这比您想象的要复杂,因为您也可以编写someview.*
。
总而言之 - 它很复杂,没有人想要它来完成它的工作来实现它。