【问题标题】:How to delete a table in Amazon Redshift only if the table exists仅当表存在时如何删除 Amazon Redshift 中的表
【发布时间】:2014-02-07 20:39:40
【问题描述】:

我正在尝试在 Amazon Redshift 中实施一个 ETL 流程,该流程需要自动重新创建某些表,并且我需要脚本仅在这些表已经存在于数据库中时删除它们。

是否有任何表格目录可供我检查表格是否存在?还是类似于 PSQL 中的DROP TABLE IF EXISTS 的命令?

【问题讨论】:

    标签: sql amazon-web-services amazon-redshift


    【解决方案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
    

    详情请看以下链接。

    【讨论】:

    • 如何与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 语句中做到这一点?
    • 从查询中删除“覆盖”,与“选择进入”做同样的事情
    猜你喜欢
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    • 2019-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    相关资源
    最近更新 更多