在 SQL 中向视图添加新列

问题描述 投票:0回答:5

我有一个数据库,并且我已经用我想要的数据创建了一个视图。数据看起来像这样:

    n     |   value |
----------+---------+
 50404791 |     112 | 
  5034591 |     164 |
 50280287 |      31 |

我想添加一列这样的文本:

    n     |   value | status |
----------+---------+--------+
 50404791 |     112 |default | 
  5034591 |     164 |biggest |
 50280287 |      31 |smallest|

我尝试过

Alter Table Table1 Add Column status text ;
,但似乎文本不是一种数据类型。有什么建议吗?

sql postgresql sql-view
5个回答
3
投票

在 Rextester.com 上测试(记住,无论如何都要避免在视图中使用

SELECT *

CREATE TABLE TABLE1 (ID INTEGER);
CREATE VIEW V1 AS SELECT * FROM TABLE1;
INSERT INTO TABLE1 VALUES (0);

ALTER TABLE TABLE1 ADD COLUMN STATUS TEXT;    
INSERT INTO TABLE1 (ID, STATUS) VALUES (1, 'aaa');

SELECT * FROM V1;
DROP VIEW V1;

CREATE VIEW V1 AS SELECT * FROM TABLE1;
SELECT * FROM V1;

输出:

    id
1   0
2   1

    id  status
1   0   NULL
2   1   aaa

3
投票

在 Postgres 中,您可以使用

CREATE OR REPLACE
而不删除视图并执行以下操作

    CREATE OR REPLACE VIEW View1 AS
        SELECT value, status FROM Table 1;

更改原始表只会更改该表,而不会更改视图。


2
投票

您需要删除并重新创建视图 - 您无法更改现有视图。是的,文本是一种数据类型。


0
投票

我在

postgresql.org

找到了答案

您可以通过右键单击视图并选择 pgAdmin 来执行此操作 CREATE SCRIPT 取消注释: DROP VIEW ;并编辑创建 查看以删除该列。

但是,如果该视图在其他视图中使用,则必须将它们全部删除 并按顺序重新创建。

或者,您可以从 pg_catalog.pg_attribute 表。但请确保您认识自己 只删除您要删除的表,而不删除其他表 列...使用以下内容:

从 pg_attribute 中删除,其中 attrelid = regclass 'yourviewname' 和 attname = '要删除的列名'

最好先进行几次选择,直到有选择为止 正确:

选择 attrelid::regclass 作为任何内容,* from pg_attribute where attname = '要删除的列名'

约翰·内尔。


0
投票

我的方法是在 pgAdmin 中,右键单击视图,然后单击“脚本”->“创建脚本”。

这给了我添加到的创建/替换结构:

CREATE OR REPLACE VIEW schema.view_name
 AS
 SELECT a."COLUMN1",
    a."COLUMN2",
    b."COLUMN1",
    b."COLUMN2",
    b."NEWCOLUMN1"
    FROM schema."TABLEA" a
    LEFT JOIN schema."TABLEB b ON a."ID" = b."ID"

ALTER TABLE shcema.view_name
    OWNER TO postgres;

添加列(例如:b.“NEWCOLUMN1”)并运行。如果我有很多,我将运行一个 python 脚本来格式化要粘贴的列。

始终保存原始内容,以便可以恢复!

© www.soinside.com 2019 - 2024. All rights reserved.