2013-07-26 6 views

risposta

16

Al momento penso che non sia possibile (si spera che cambierà in futuro). In passato, quando mi sono imbattuto in questo tipo di situazione, ho creato una nuova tabella e ho copiato i dati da quelli vecchi in essa.

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

ADD [COLUMN] nome_colonna Aggiunge una colonna con il nome specificato al tavolo. È possibile aggiungere solo una colonna in ogni istruzione ALTER TABLE.

Non è possibile aggiungere una colonna che sia la chiave di distribuzione (DISTKEY) o una chiave di ordinamento (SORTKEY) della tabella.

Non è possibile utilizzare una tabella comando ALTER ADD COLUMN per modificare la tabella e la colonna seguenti attributi:

UNICHE

PRIMARY KEY

RIFERIMENTI (chiave esterna)

IDENTITÀ

La lunghezza massima del nome della colonna è di 127 caratteri; i nomi più lunghi vengono troncati a 127 caratteri. Il numero massimo di colonne che è possibile definire in una singola tabella è 1600.

24

Come menzionato da Yaniv Kessler, non è possibile aggiungere o modificare distkey e ordinare la chiave dopo aver creato una tabella, e si deve ricreare una tabella e copiare tutti i dati nella nuova tabella. È possibile utilizzare il seguente formato SQL per ricreare una tabella con un nuovo design.

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; 

Nella mia esperienza, questo SQL è utilizzato non solo per cambiare distkey e SortKey, ma anche impostare la codifica (compressione) tipo.

+0

Questa è la migliore risposta. Potrei aggiungere che potrebbe essere più sicuro eseguire la ridenominazione della tabella una volta completata l'operazione. –

+1

Questo è abbastanza tardi, ma mi trovo nella stessa situazione e ho fatto qualche ricerca su quale sarebbe stata la prestazione per questo tipo di operazione, assumendo che la tabella sia grande. I documenti di redshift menzionano che INSERT INTO dovrebbe essere usato con cautela, favorendo i comandi COPY o CREATE TABLE AS. Gli [esempi per CTAS] (http://docs.aws.amazon.com/redshift/latest/dg/r_CTAS_examples.html) menzionano esplicitamente questo problema. – paulsef11

+0

Il problema con questo metodo è che se si dispone di viste in base alla tabella originale, la caduta non funzionerà. – Pasha

22

Per aggiungere alla risposta di Yaniv, il modo ideale per farlo è probabilmente utilizzando il comando CREATE TABLE AS. È possibile specificare esplicitamente distkey e ordinamento. Cioè

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

Ulteriori esempi:

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

EDIT

ho notato che questo metodo non consente di mantenere la codifica. Redshift si codifica automaticamente solo durante un'istruzione di copia. Se questa è una tabella persistente, è necessario ridefinire la tabella e specificare la codifica.

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

insert into test_table select * from test_table; 

si può capire che codifica da utilizzare eseguendo analyze compression test_table;

0

Ho seguito questo approccio per aggiungere le colonne di ordinamento miei table_transactons tabella sua più o meno lo stesso approccio solo meno numero di comandi.

1) alter table table_transactions rinomina in table_transactions_backup; 2) creare tabella ordinamento composto table_transactions (key1, key2, key3, key4) come select * da table_transactions_backup; 3) drop table table_transactions_backup;

Problemi correlati