PostgreSQL:从视图中删除列


10

VIEW正在尝试为其创建演化脚本的位置,因此可以在其中添加一列。那部分工作正常;列添加就好了。但是,相反的方法无效。删除最后添加的列失败并显示一条ERROR: cannot drop columns from view消息。问题在于,这个特定的视图有很多引用,包括从和到的引用,因此,我不能只是DROP CASCADE一个令人毛骨悚然的东西!

为什么无法从给定中删除新添加的列VIEW?然后,我该怎么做才能完成此任务?

(注意:这里是实际情况,但在许多其他情况下,我也很可能会看到类似的情况,也就是从视图中删除列。)


您是如何首先添加列的?你不能ALTER VIEW ... ADD COLUMN。您正在使用CREATE OR REPLACE VIEW吗?请显示您的代码
Craig Ringer 2014年

@CraigRinger,是的,CREATE OR REPLACE VIEW具有相同的定义,除了一个额外的列(因为引用表中添加了新列,因此视图必须包含它)。“下放”将从引用表中删除该列,因此VIEW也必须不再返回该列。
Yanick Rochon 2014年

Answers:


13

PostgreSQL(至少9.4以上)不支持使用删除列CREATE OR REPLACE VIEW

新查询必须生成与现有视图查询生成的列相同的列(即,相同的列名以相同的顺序和相同的数据类型),但是它可能会将其他列添加到列表的末尾。

没有根本原因不能添加对删除列的支持,但是还没有人完成实现它的工作。

CREATE OR REPLACE VIEW将必须递归扫描所有依赖项,并确保它们中没有一个引用要删除的列。如果他们使用SELECT *它,则必须从*依赖项的扩展中删除该列,然后也扫描依赖项。这样做需要做大量工作,而且在某些地方还不清楚删除列的行为应如何准确,尤其是在与转储和重新加载进行交互时。因此,没有人想要足够的功能来实现它。欢迎补丁和/或赞助开发。

您将必须删除视图及其所依赖的所有内容,然后重新创建它及其依赖项。(曾经是真同样添加到视图中的列;用于添加列在支持8.4引入)。

请注意,通常不希望DDL是可逆的。“权力下放”的概念确实有缺陷。例如,如果您删除一列,然后再次添加它,则数据仍然消失。


1
因此,您的意思是,每当具有复杂关系的大型应用程序需要更改列时,都需要重新创建整个(或至少大部分)DDL?我对postgre并没有太多的经验,但是来自mySQL,我从来没有遇到过类似的问题(使用Oracle,SQL Server或MySQL),而且我感到奇怪的是,更改不能简单地完成并且出错(如果任何)改为在执行时抛出。这个限制是非常严格的。
Yanick Rochon 2014年

@YanickRochon是的,这很痛苦,我希望看到它有所改善。如果您想帮助实现这一目标,请考虑为此投入资金;请参阅postgresql.org/support/professional_support
Craig Ringer 2014年

我们太小了,无法为这样的企业提供资金。但是很高兴看到它不是固定的主题。
Yanick Rochon 2014年

1
@YanickRochon还算公平。它在TODO上-“在基础表发生更改时允许视图/规则重新编译”,wiki.postgresql.org/wiki/Todo#Views_and_Rules
Craig Ringer 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.