2013-07-26 19 views

回答

16

目前我认为它不可能(希望未来会改变)。在过去,当我遇到这种情况时,我创建了一个新表并将旧数据复制到其中。

http://docs.aws.amazon.com/redshift/latest/dg/r_ALTER_TABLE.html

ADD [COLUMN]列名 添加具有指定名称表中的一列。您可以在每个ALTER TABLE语句中只添加一列。

您不能添加作为表的分配键(DISTKEY)或排序键(SORTKEY)的列。

不能使用ALTER TABLE ADD COLUMN命令如下表和列修改属性:

UNIQUE

PRIMARY KEY

引用(外键)

IDENTITY

最大列名长度为127个字符;较长的名称被截断为127个字符。您可以在单个表格中定义的最大列数是1,600。

24

正如Yaniv Kessler所说,创建表后不能添加或更改distkey和sort键,并且必须重新创建表并将所有数据复制到新表中。 您可以使用以下SQL格式重新创建具有新设计的表格。

ALTER TABLE test_table RENAME TO old_test_table; 
CREATE TABLE new_test_table([new table columns]); 
INSERT INTO new_test_table (SELECT * FROM old_test_table); 
ALTER TABLE new_test_table RENAME TO test_table; 
DROP TABLE old_test_table; 

根据我的经验,这个SQL用于不仅改变distkey和排序关键字,而且还设置了编码(压缩)型。

+0

这是最好的答案。我可能会补充说,在操作完成后执行表重命名可能更安全。 –

+1

这很晚了,但我处于相同的情况,并且我已经做了一些挖掘,以了解这种类型的操作的性能,假设表很大。 Redshift文档提到应谨慎使用INSERT INTO,以支持COPY或CREATE TABLE AS命令。 [CTAS示例](http://docs.aws.amazon.com/redshift/latest/dg/r_CTAS_examples.html)明确提到了这个问题。 – paulsef11

+0

这种方法的问题是,如果您的视图取决于原始表格,则放置不起作用。 – Pasha

22

要添加到Yaniv的答案,理想的方法是使用CREATE TABLE AS命令。您可以明确指定distkey和sortkey。即

CREATE TABLE test_table_with_dist 
distkey(field) 
sortkey(sortfield) 
AS 
select * from test_table 

其他例子:

http://docs.aws.amazon.com/redshift/latest/dg/r_CTAS_examples.html

编辑

我注意到,这个方法不保留编码。 Redshift仅在复制语句期间自动编码。如果这是一个持久表,您应该重新定义该表并指定编码。

create table test_table_with_dist(
    field1 varchar encode row distkey 
    field2 timestam pencode delta sortkey); 

insert into test_table select * from test_table; 

你可以计算出运行analyze compression test_table;

0

我跟着这个方法添加排序列到我的表table_transactons其或多或少相同的方法只有命令的数量较少使用哪种编码。

1)alter table table_transactions rename to table_transactions_backup; 2)创建表table_transactions复合sortkey(key1,key2,key3,key4)作为select * from table_transactions_backup; 3)drop table table_transactions_backup;