仅当表存在时如何删除 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 中的表的主要内容,如果未能解决你的问题,请参考以下文章

仅当表中不存在该值时才更新 SQL 列

仅当表中不存在两个 id 的组合时才将值插入表中

仅当表中有数据时如何触发自动化作业

当表在不同的架构中时,如何从 SQL Server 导入所有带有 sqoop 的表?

仅当存在时才触发 DROP (ORACLE) [重复]

仅当表不为空时,T-SQL 才连接表