更改从属表的排序和分发

时间:2018-05-23 07:29:18

标签: amazon-web-services amazon-redshift

这是在Redshift表中更改sort和dist键的查询。

CREATE TABLE new_dummy 
  DISTKEY (id)
  SORTKEY (account_id,created_at)
  AS (SELECT * FROM dummy);

ALTER TABLE dummy RENAME TO old_dummy;
ALTER TABLE new_dummy RENAME TO dummy;
DROP TABLE old_dummy;

它抛出以下错误:

  

错误:无法删除表old_dummy,因为其他对象依赖于它   提示:使用DROP ... CASCADE也可以删除相关对象。

因此无法更改依赖表的密钥吗?

2 个答案:

答案 0 :(得分:0)

您的VIEW似乎引用了原始(dummy)表格。

重命名表时,无论命名是什么,VIEW都会继续指向原始表。因此,尝试删除表会导致错误。

在删除表格之前,您需要删除视图。然后,您可以重新创建视图以指向新的dummy表。

所以,流程将是:

  • 创建new_dummy并加载数据
  • 删除视图
  • 删除dummy
  • new_dummy重命名为dummy
  • 创建视图

你可能认为他很糟糕,但它实际上是一个很好的功能,因为重命名一个表不会破坏任何视图。视图将自动保留在正确的表格中。

<强>更新

根据Joe在下面的评论,流程将是:

  • 创建视图......没有模式绑定

然后,每次重新加载:

  • 创建new_dummy并加载数据
  • 删除dummy
  • new_dummy重命名为dummy

答案 1 :(得分:0)

此答案基于以下事实:您在表定义中有外键引用,这与重命名和删除表的过程不兼容。

鉴于这种情况,我建议您按如下方式加载数据:

  • 开始交易
  • DELETE *来自表格
  • 使用INSERT INTO
  • 加载数据
  • 结束交易

这意味着您完全正在重新加载表的内容。将其包含在事务中意味着没有句子表显示为“空”的时间段。

但是,这会使表格处于混乱状态,需要VACUUM删除旧数据。

或者,您可以:

  • TRUNCATE表格
  • 使用INSERT INTO
  • 加载数据

TRUNCATE不需要清理,因为它清除了与表关联的所有数据(不只是将其标记为删除)。但是,TRUNCATE会立即提交事务,因此表格将为空。