2014-02-07 26 views
2

我试图在Amazon Redshift中实现需要自动重新创建某些表格的ETL过程,并且我只需要脚本在已经存在的情况下才删除这些表格存在于数据库中。如何仅在表格存在时删除Amazon Redshift中的表格

是否有任何表目录,我可以检查表的存在?或者是类似于PSQL中的DROP TABLE IF EXISTS的命令?

回答

4

更新:

现在红移支持DROP TABLE IF与EXISTS子句。 http://docs.aws.amazon.com/redshift/latest/dg/r_DROP_TABLE.html


由于红移不支持DROP TABLE IF EXISTS,我们通过让现有的表名处理它。

要获取Redshift上的表名,我使用的是pg_table_def表。例如,我运行以下sql来获取除系统表以外的所有表名。

SELECT 
    schemaname, tablename 
FROM 
    pg_table_def 
WHERE 
    schemaname <> 'pg_catalog' 
    AND schemaname <> 'information_schema' 
    AND schemaname !~ '^pg_toast' 
GROUP BY 
    schemaname,tablename; 

这是一个样本结果。

schemaname | tablename 
------------+----------- 
my_schema | access_log 
my_schema | error_log 
my_schema | vmstats_log 
public  | users 
public  | groups 

有关详细信息,请参阅以下链接。

+0

这怎么可以与'IF'结合?我看到'IF'似乎并不存在于RedShift中。或者这会发生在发出多个语句的自定义脚本中? – Mendhak

+0

现在Redshift支持IF EXISTS子句,因为我更新了我的答案。第一篇文章的意图是在SQL之外处理它。 –

1

怎么样,而不是删除表,你做一个插入覆盖吗?

INSERT OVERWRITE INTO target 
SELECT s.* FROM staging s LEFT JOIN target t 
ON s.primaryKey = t.primaryKey AND s.distKey = t.distKey 
WHERE t.primaryKey IS NULL; 

否则尝试,为什么你做你做的事情给我解释,我会用更多的帮助更新。这是红色设计的一个例子,通常有一个原因,你不能做你想做的事情,但有一个“红移”的方式。

+0

我如何在SELECT INTO语句中做到这一点? – DJo

+0

从查询中删除“覆盖”,将执行与“select into”相同的操作 –