我有一张桌子' X'我想放下桌子并创建一个视图' X'只有视图' X'不存在。 请告诉我如何在firebird,oracle,postgres中查看此内容
答案 0 :(得分:1)
在Firebird中你可以:
CREATE OR ALTER VIEW ...
或检查是否存在:
SELECT * FROM rdb$relations
WHERE rdb$relation_type = 1
AND rdb$relation_name = <view_name>
答案 1 :(得分:0)
视图只是一个SQL,您不能删除表并在其上创建视图。但是,在Oracle中,如果要查找视图X是否存在于数据库中,只需查询视图user_objects:
select count(*) from user_objects where object_name='X' and object_type='VIEW'
如果结果&gt; = 0,则存在名为X的视图。类似的查询可用于查询表是否存在。
Oracle中最简单的方法就是使用create or replace view X as ....
,您无需关心名为X的视图是否存在。
答案 2 :(得分:0)
PostgreSQL特定的答案:您可以使用anonymous code block。
首先,很显然,如果您的新视图应该提供表X中的数据,则不能删除该表。但是,假设新视图X将从其他地方获取数据,则:
DO LANGUAGE plpgsql $BODY$
BEGIN
PERFORM FROM information_schema.views WHERE table_name = 'x';
IF NOT FOUND THEN
DROP TABLE X CASCADE;
CREATE OR REPLACE VIEW X AS SELECT * FROM Y;
END IF;
END $BODY$;
请注意,尽管表名称在PostgreSQL中不区分大小写,但是信息模式table_name
是区分大小写的,并且值存储在LOWERCASE中(不确定这是标准的还是什么)。
尽管在这种情况下不相关,但是请注意,视图同时显示在信息模式的tables
和views
表中(同样,不确定这是否是PostgreSQL的特性。)< / p>
如果新视图应该具有表X中的数据,那么您仍然可以通过重命名表来做到这一点(即使表X在外键的其他位置被引用,至少在平凡的情况下也是如此)我有-显然,该视图已接管了所有基础对象ID,它们都是自动神奇地处理的):
DO LANGUAGE plpgsql $BODY$
BEGIN
PERFORM FROM information_schema.views WHERE table_name = 'x';
IF NOT FOUND THEN
ALTER TABLE X RENAME TO _X_table;
CREATE OR REPLACE VIEW X AS SELECT * FROM _X_table;
END IF;
END $BODY$;