加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

更改视图中使用的PostgreSQL列

发布时间:2020-12-13 16:06:06 所属栏目:百科 来源:网络整理
导读:我希望PostegreSQL能够放松一下.每次我想要更改视图中使用的列时,似乎我必须删除视图,更改字段然后重新创建视图.我可以放弃额外的保护并告诉PostgreSQL让我更改字段然后找出对视图的调整吗? 澄清: 我理解一个观点是什么.事实上,这是因为视图就像一个子查询
我希望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

解决方法

这种情况的永久解决方案

为了避免这个问题,使用数据类型文本或varchar /字符变化而不使用长度说明符而不是字符变化(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中的视图不仅仅是“子查询的别名”.视图作为特殊表实现,规则为SELECT TO my_view DO INSTEAD. (这就是为什么你可以使用ALTER TABLE命令改变视图的原因.)你可以为它授予特权,添加注释甚至定义列默认值(对INSERT到my_view DO INSTEAD ……的规则很有用).阅读手册here或here中的更多内容.

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

但是,如果要更改结果列的数据类型(如在手边的情况下),则无法创建或替换视图.你必须DROP旧和创建一个新视图.这永远不会删除基础表的任何数据.但是,它将删除视图的任何其他属性,这些属性也必须重新创建.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读