我已经创建了一个视图,它是SELECT A,B from TABLE_a;然后我将TABLE_a中的列a重命名为c. 有趣的是,列重命名后的SELECT*FROM VIEW仍然有效,但是列a不再存在于table_a中. 为什么这个观点没有被宣布无效?查询SELECT a,b from TABLE_X返回NOW ERROR,这是合理的:"ERROR:列a不存在"

CREATE TABLE table_a(a int, b int);
CREATE VIEW test_view 
AS
SELECT a, b
FROM table_a;

SELECT *
FROM test_view;

ALTER TABLE table_a
RENAME COLUMN a TO c;

-- it works
SELECT *
FROM test_view;

-- it doesn't work
SELECT a, b
FROM table_a;

推荐答案

请看一下视图的DDL.在重命名该列之前,您将看到实际编写的定义:

CREATE OR REPLACE VIEW test_view
AS SELECT a,
    b
   FROM table_a;

但是,重命名表列后的视图DDL将为:

CREATE OR REPLACE VIEW public.test_view
AS SELECT c AS a,
    b
   FROM table_a;

请注意,选定的列也已更新,但以前的名称仍保留为该列的别名.因此,查看查询视图的结果将有see个相同的列名.

注意:根据检索视图定义的方式(以上来自DBeaver版本23.3.3),会有一些细微的差异.您也可以求助于函数pg_get_viewdef(...).

Sql相关问答推荐

在SQL中向每个子字节组添加字节行

如何重用表值用户定义函数调用的结果?

Stack Exchange站点上的最短帖子(按正文长度计算,用户名为原始发帖(SEDE))

如何使用ROW_NUM() Select 一个没有第二条记录的实例?

在甲骨文中查找前一个星期一的S日期

是否可以为表中的所有列生成散列值?

SQL Athena/prest判断值是否在嵌套的json数组中

如何使子查询在UPDATE语句期间获得最新更新

查找滑动窗口框架中的最大和最小列值

SQL:使用年/月/日分区查询某个时间段的数据

VS代码无法识别SQL代码中带括号的字符串

查询以从时间范围列表中查找唯一时间段

删除每个不同日期中未 Select 的最短最长时间

如何对 jsonb 中的字段执行求和,然后使用结果过滤查询的输出

snowflake中的动态文件名生成

使用 regexp_replace 替换所有出现的特殊字符

过滤具有一对多关系的两个表之间的数据

使用 SAVE TRANSACTION 时 BEGIN 和 COMMIT 语句的数量不匹配

如何在一个存储过程中创建全局临时表,并在另一个存储过程中使用它

从 Pyspark 转换为具有多个分组条件的语句时的情况