我有一个数据库,并且我已经用我想要的数据创建了一个视图。数据看起来像这样:
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 ;
,但似乎文本不是一种数据类型。有什么建议吗?
在 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
在 Postgres 中,您可以使用
CREATE OR REPLACE
而不删除视图并执行以下操作
CREATE OR REPLACE VIEW View1 AS
SELECT value, status FROM Table 1;
更改原始表只会更改该表,而不会更改视图。
您需要删除并重新创建视图 - 您无法更改现有视图。是的,文本是一种数据类型。
我在
postgresql.org
找到了答案
您可以通过右键单击视图并选择 pgAdmin 来执行此操作 CREATE SCRIPT 取消注释: DROP VIEW ;并编辑创建 查看以删除该列。
但是,如果该视图在其他视图中使用,则必须将它们全部删除 并按顺序重新创建。
或者,您可以从 pg_catalog.pg_attribute 表。但请确保您认识自己 只删除您要删除的表,而不删除其他表 列...使用以下内容:
从 pg_attribute 中删除,其中 attrelid = regclass 'yourviewname' 和 attname = '要删除的列名'
最好先进行几次选择,直到有选择为止 正确:
选择 attrelid::regclass 作为任何内容,* from pg_attribute where attname = '要删除的列名'
约翰·内尔。
我的方法是在 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 脚本来格式化要粘贴的列。
始终保存原始内容,以便可以恢复!