为什么不能使用“创建或替换”更改视图?

Ste*_*han 5 postgresql view

Postgresql 文档在这一点上很清楚:您不能更改现有视图的列。

新查询必须生成与现有视图查询生成的列相同的列(即,列名相同,顺序和数据类型相同)(...)

参考:http : //www.postgresql.org/docs/9.3/static/sql-createview.html

为什么我必须删除视图或更改它来修改它?

Cra*_*ger 7

这是一个实现限制。当然,理论上这是可能的,但是还没有人编写代码来处理它。

为了应对列删除或类型​​更改,PostgreSQL 必须扫描引用正在修改的视图的每个视图(使用pg_catalog.pg_depend),以查看它们中的任何一个是否依赖于该列。它还需要查找整行引用并在这些情况下禁止更改。

不太清楚为什么不允许添加列。同样,我怀疑这归结为整行引用。如果pg_depend检查了整行引用但没有找到任何引用,并且新列出现在末尾,则可以添加它。

但是,使用创建的视图SELECT * FROM不会“继承”新列,因为*在视图创建期间会扩展为列列表。因此,如果您有view_A一个SELECT * FROM view_B,并且您向 中添加了一列view_B,它就不会出现在view_A. 但是,如果您删除并重新创建view_A,则会出现该列。不用说,这不好。为了解决这个问题,PostgreSQL 必须跟踪给定视图的列列表(PostgreSQL 内部术语中的“目标列表”)是否来自*通配符。这比您想象的要复杂,因为您也可以编写someview.*

总而言之 - 它很复杂,没有人想要它来完成它的工作来实现它。

  • 至少从 8.4+ 开始,可以“在列表末尾添加其他列”。 (2认同)
  • @Alex 不,因为那需要删除任何依赖视图。你可以`DROP VIEW ... CASCADE`,但是你必须重新创建所有作为依赖项被删除的视图。 (2认同)