gpt4 book ai didi

sql - 更改 View 中使用的 PostgreSQL 列

转载 作者:行者123 更新时间:2023-11-29 11:23:32 24 4
gpt4 key购买 nike

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

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

假设我有以下内容:

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

CREATE OR REPLACE VIEW monkey_names AS
SELECT name
FROM monkey

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

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

最佳答案

这个案例的永久解决方案

要完全避免此问题,请使用不带长度说明符的数据类型 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);

您可以随时更改或删除该约束,而无需触及像 View 这样的依赖对象,也不会因为类型的更改而强制 Postgres 在表中写入新行(这在现代版本的 Postgres 中不再总是必要的) .

详细解释

PostgreSQL 中的 View 不仅仅是“子查询的别名”。 View 被实现为具有规则 ON SELECT TO my_view DO INSTEAD 的特殊表。 (这就是为什么您可以使用 ALTER TABLE 命令更改 View 的原因。)您可以向其GRANT 权限、添加注释甚至定义列默认值(对规则很有用 在插入到 my_view 时,请改为...)。在手册中阅读更多信息 herehere .

如果您更改基础对象,您可能也需要更改依赖 View 。 ALTER VIEW 语句只能更改 View 的辅助属性。使用 CREATE OR REPLACE VIEW 更改查询 - 它将保留任何其他属性。

但是,如果您想要更改结果列的数据类型(如手头的情况),CREATE OR REPLACE VIEW 是不可能的。您必须DROP 旧 View 并CREATE 一个新 View 。这永远不会删除基础表的任何数据。不过,它删除 View 的任何其他属性。

关于sql - 更改 View 中使用的 PostgreSQL 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8524873/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com