更改视图中使用的PostgreSQL列

时间:2011-12-15 18:30:40

标签: sql postgresql types varchar sql-view

我希望PostegreSQL放松一下。每次我想要更改视图中使用的列时,似乎我必须删除视图,更改字段然后重新创建视图。我可以放弃额外的保护并告诉PostgreSQL让我更改字段然后找出对视图的调整吗?

澄清: 我理解一个观点是什么。事实上,这是因为视图就像一个子查询,我希望我可以更改基础表并让视图获取更改。

假设我有以下内容:

CREATE TABLE monkey
(
  "name" character varying(50) NOT NULL,
)

CREATE OR REPLACE VIEW monkey_names AS 
 SELECT name
   FROM monkey

我真的只想在迁移脚本中执行以下操作,而不必删除并重新创建视图。

ALTER TABLE monkey ALTER COLUMN "name" character varying(100) NOT NULL

1 个答案:

答案 0 :(得分:11)

此案例的永久解决方案

要避免此问题,请使用数据类型textvarchar / character varying而不使用长度说明符而不是character varying(n)Read about these data types in the manual.

CREATE TABLE monkey(name text NOT NULL)

如果您确实要强制执行最大长度,请创建CHECK constraint

ALTER TABLE monkey 
  ADD CONSTRAINT monkey_name_len CHECK (length(name) < 101);

您可以随时更改或删除该约束,而不会触及视图之类的依赖对象,也不会强制Postgres根据类型的更改在表中写入新行(现代版本的Postgres中并不总是需要这样做)

详细说明

正如@Michael所提议的,我添加了一些更一般的信息:

PostgreSQL中的视图不仅仅是“子查询的别名”。视图实现为具有规则ON SELECT TO my_view DO INSTEAD的特殊表。 (这就是您可以使用ALTER TABLE命令更改视图的原因。)您可以GRANT权限,添加注释甚至定义列默认值(对规则ON INSERT TO my_view DO INSTEAD...有用)。请阅读手册herehere

如果更改基础对象,则还需要更改任何从属视图的定义查询。 ALTER VIEW语句只能更改视图的辅助属性。使用CREATE OR REPLACE VIEW更改查询 - 它将保留任何其他属性。

但是,如果要更改结果列的数据类型(如手头的情况),则无法CREATE OR REPLACE VIEW。您必须DROP旧视图和CREATE新视图。这永远不会删除基础表的任何数据。但删除视图的任何其他属性,这些属性也必须重新创建。