这是在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也可以删除相关对象。
因此无法更改依赖表的密钥吗?
答案 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会立即提交事务,因此表格将为空。