我试图在Amazon Redshift中实现需要自动重新创建某些表格的ETL过程,并且我只需要脚本在已经存在的情况下才删除这些表格存在于数据库中。如何仅在表格存在时删除Amazon Redshift中的表格
是否有任何表目录,我可以检查表的存在?或者是类似于PSQL中的DROP TABLE IF EXISTS
的命令?
我试图在Amazon Redshift中实现需要自动重新创建某些表格的ETL过程,并且我只需要脚本在已经存在的情况下才删除这些表格存在于数据库中。如何仅在表格存在时删除Amazon Redshift中的表格
是否有任何表目录,我可以检查表的存在?或者是类似于PSQL中的DROP TABLE IF EXISTS
的命令?
更新:
现在红移支持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
有关详细信息,请参阅以下链接。
怎么样,而不是删除表,你做一个插入覆盖吗?
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;
否则尝试,为什么你做你做的事情给我解释,我会用更多的帮助更新。这是红色设计的一个例子,通常有一个原因,你不能做你想做的事情,但有一个“红移”的方式。
我如何在SELECT INTO语句中做到这一点? – DJo
从查询中删除“覆盖”,将执行与“select into”相同的操作 –
这怎么可以与'IF'结合?我看到'IF'似乎并不存在于RedShift中。或者这会发生在发出多个语句的自定义脚本中? – Mendhak
现在Redshift支持IF EXISTS子句,因为我更新了我的答案。第一篇文章的意图是在SQL之外处理它。 –