2013-07-26 14 views

Trả lời

16

Hiện tại tôi nghĩ rằng điều đó là không thể (hy vọng điều đó sẽ thay đổi trong tương lai). Trong quá khứ khi tôi gặp phải tình huống như thế này, tôi đã tạo một cái bàn mới và sao chép dữ liệu từ cái cũ vào đó.

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

Thanh [COLUMN] column_name Thêm một cột với tên được chỉ định vào bảng. Bạn chỉ có thể thêm một cột trong mỗi câu lệnh ALTER TABLE.

Bạn không thể thêm cột là khóa phân phối (DISTKEY) hoặc khóa sắp xếp (SORTKEY) của bảng.

Bạn không thể sử dụng một TABLE ALTER ADD lệnh COLUMN để sửa đổi các bảng và cột sau thuộc tính:

UNIQUE

PRIMARY KEY

Tài liệu tham khảo (khoá ngoại)

SẮC

Độ dài tên cột tối đa là 127 ký tự; tên dài hơn được cắt ngắn thành 127 ký tự. Số cột tối đa bạn có thể xác định trong một bảng là 1.600.

24

Như Yaniv Kessler đã đề cập, bạn không thể thêm hoặc thay đổi khóa distkey và sắp xếp sau khi tạo bảng và bạn phải tạo lại bảng và sao chép tất cả dữ liệu vào bảng mới. Bạn có thể sử dụng định dạng SQL sau để tạo lại một bảng với thiết kế mới.

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; 

Kinh nghiệm của tôi, SQL này được sử dụng không chỉ thay đổi distkey và sortkey, mà còn thiết lập loại mã hóa (nén).

+0

Đây là câu trả lời hay nhất. Tôi có thể thêm rằng nó có thể an toàn hơn để làm việc đổi tên bảng sau khi hoàn thành thao tác. –

+1

Điều này là khá muộn, nhưng tôi đang ở trong tình trạng tương tự và tôi đã làm một số đào để những gì hiệu suất cho loại hình hoạt động sẽ được, giả sử bảng lớn. Các tài liệu Redshift đề cập rằng INSERT INTO nên được sử dụng một cách thận trọng, ưu tiên các lệnh COPY hoặc CREATE TABLE AS. [Ví dụ về CTAS] (http://docs.aws.amazon.com/redshift/latest/dg/r_CTAS_examples.html) đề cập đến vấn đề này một cách rõ ràng. – paulsef11

+0

Vấn đề với phương pháp này là nếu bạn có chế độ xem tùy thuộc vào bảng gốc, thì trình đơn thả của bạn sẽ không hoạt động. – Pasha

22

Để thêm vào câu trả lời của Yaniv, cách lý tưởng để thực hiện việc này có thể là sử dụng lệnh CREATE TABLE AS. Bạn có thể chỉ định khóa và khóa phân loại một cách rõ ràng. I E.

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

ví dụ khác:

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

EDIT

tôi đã nhận thấy rằng phương pháp này không bảo vệ mã hóa. Redshift chỉ tự động mã hóa trong một bản sao chép. Nếu đây là một bảng bền vững, bạn nên xác định lại bảng và chỉ định bảng mã.

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

insert into test_table select * from test_table; 

Bạn có thể tìm ra mã hóa để sử dụng bằng cách chạy analyze compression test_table;

0

Tôi đi theo phương pháp này để thêm các cột sắp xếp để table_transactons bàn của tôi tiếp cận nhiều hơn hoặc ít hơn cùng của nó chỉ ít số lệnh.

1) thay đổi bảng table_transactions đổi tên thành table_transactions_backup; 2) tạo bảng table_transactions compound sortkey (key1, key2, key3, key4) như select * từ table_transactions_backup; 3) bảng thả table_transactions_backup;