仅当表存在时如何删除 Amazon Redshift 中的表
Posted
技术标签:
【中文标题】仅当表存在时如何删除 Amazon Redshift 中的表【英文标题】:How to delete a table in Amazon Redshift only if the table exists 【发布时间】:2014-02-07 20:39:40 【问题描述】:我正在尝试在 Amazon Redshift 中实施一个 ETL 流程,该流程需要自动重新创建某些表,并且我需要脚本仅在这些表已经存在于数据库中时删除它们。
是否有任何表格目录可供我检查表格是否存在?还是类似于 PSQL 中的DROP TABLE IF EXISTS
的命令?
【问题讨论】:
【参考方案1】:更新:
现在 Redshift 支持带有 IF EXISTS 子句的 DROP TABLE。 http://docs.aws.amazon.com/redshift/latest/dg/r_DROP_TABLE.html
由于 Redshift 不支持 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
详情请看以下链接。
http://docs.aws.amazon.com/redshift/latest/dg/r_PG_TABLE_DEF.html【讨论】:
如何与IF
结合使用?我看到 IF
在 RedShift 中似乎也不存在。或者这是否必须在发出多个语句的自定义脚本中发生?
现在 Redshift 支持 IF EXISTS 子句,因为我更新了我的答案。我第一篇文章的意图是在 SQL 之外处理它。【参考方案2】:
如果不删除表,而是进行插入覆盖,怎么样?
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 语句中做到这一点? 从查询中删除“覆盖”,与“选择进入”做同样的事情以上是关于仅当表存在时如何删除 Amazon Redshift 中的表的主要内容,如果未能解决你的问题,请参考以下文章