Thay đổi kiểu dữ liệu cột trong Amazon Redshift


85

Làm cách nào để thay đổi kiểu dữ liệu cột trong cơ sở dữ liệu Amazon Redshift?

Tôi không thể thay đổi kiểu dữ liệu cột trong Redshift; có cách nào để sửa đổi loại dữ liệu trong Amazon Redshift không?


6
"Tạo bảng như đã chọn ..." Và thiết kế bảng mới của bạn với loại cột tốt hơn.
Guy

Câu trả lời:


135

Như đã lưu ý trong tài liệu ALTER TABLE , bạn có thể thay đổi độ dài của VARCHARcác cột bằng cách sử dụng

ALTER TABLE table_name
{
    ALTER COLUMN column_name TYPE new_data_type 
}

Đối với các loại cột khác, tất cả những gì tôi có thể nghĩ đến là thêm một cột mới với một kiểu dữ liệu chính xác, sau đó chèn tất cả dữ liệu từ cột cũ sang cột mới và cuối cùng thả cột cũ.

Sử dụng mã tương tự như sau:

ALTER TABLE t1 ADD COLUMN new_column ___correct_column_type___;
UPDATE t1 SET new_column = column;
ALTER TABLE t1 DROP COLUMN column;
ALTER TABLE t1 RENAME COLUMN new_column TO column;

Sẽ có một sự thay đổi giản đồ - cột mới được thêm vào sẽ nằm cuối cùng trong bảng (có thể là vấn đề với COPYcâu lệnh, hãy ghi nhớ điều đó - bạn có thể xác định thứ tự cột bằng COPY)


4
ALTER hoặc cho vấn đề đó, bất kỳ tuyên bố DDL nào cam kết ngay lập tức bất kể thời tiết của nó có được bao bọc trong một giao dịch hay không.
Raniendu Singh

@RanienduSingh một số cơ sở dữ liệu hỗ trợ các câu lệnh DDL giao dịch. Tôi chưa tìm thấy danh sách có thẩm quyền, nhưng hầu hết các câu lệnh DDL trong Redshift dường như hoạt động trong một giao dịch. Tuy nhiên, tôi nghĩ rằng sắp xếp lại các hoạt động tương tự như phương pháp này được mô tả ở đây (đổi tên, thêm, cập nhật, thả) có thể mạnh mẽ hơn: simple.com/engineering/safe-migrations-with-redshift
Matt Tốt

1
Cần lưu ý rằng hiện có thể tăng kích thước của các cột varchar - xem câu trả lời của user0000 bên dưới và liên kết đến tài liệu ( docs.aws.amazon.com/redshift/latest/dg/r_ALTER_TABLE.html )
willis

1
@Tomasz Tybulewicz, bạn có vui lòng cập nhật câu trả lời của mình bao gồm câu trả lời của user0000 không? Câu trả lời của bạn đúng vào thời điểm đó nhưng tôi đã bị nhầm. May mắn thay, tôi cũng đọc được câu trả lời của
user0000

43

để tránh thay đổi giản đồ được Tomasz đề cập:

BEGIN TRANSACTION;

ALTER TABLE <TABLE_NAME> RENAME TO <TABLE_NAME>_OLD;
CREATE TABLE <TABLE_NAME> ( <NEW_COLUMN_DEFINITION> );
INSERT INTO <TABLE_NAME> (<NEW_COLUMN_DEFINITION>)
SELECT <COLUMNS>
FROM <TABLE_NAME>_OLD;
DROP TABLE <TABLE_NAME>_OLD;

END TRANSACTION;

1
Đây cũng là phương pháp chúng tôi sử dụng để tránh sao chép câu lệnh bị lệch.
smb

1
Hãy nhớ rằng bất kỳ dạng xem nào được sử dụng để chọn từ bảng cũ sẽ tiếp tục trỏ đến bảng cũ. Các drop tabletruy vấn sẽ hiển thị các lỗi phụ thuộc có thể được nhưng không nên bỏ qua.

1
Cảm ơn vì điều này, nó thực sự hữu ích. Tôi đã sử dụng nó trên một bảng có 31 triệu hàng và chỉ mất 3 phút bằng cách sử dụng loại dc1.large. Tuyệt quá! Tôi cũng sử dụng một biểu mẫu đơn giản hơn một chút:INSERT INTO <TABLE_NAME> SELECT * FROM <TABLE_NAME>_OLD;
Tom,

Đóng gói với TRANSACTION là rất quan trọng
louis_guitton

16

(Cập nhật gần đây) Có thể thay đổi kiểu cho các cột varchar trong Redshift.

ALTER COLUMN column_name TYPE new_data_type

Thí dụ:

CREATE TABLE t1 (c1 varchar(100))

ALTER TABLE t1 ALTER COLUMN c1 TYPE varchar(200)

Đây là liên kết tài liệu


Điều này hoạt động hoàn hảo. Một lớp lót tốt sẽ không thay đổi lược đồ nhưng cập nhật kiểu dữ liệu. Đây phải là câu trả lời mới được cập nhật!
Timothy Mcwilliams

8

Nếu bạn không muốn thay đổi thứ tự cột , một tùy chọn sẽ là tạo bảng tạm thời, thả và tạo bảng mới với kích thước mong muốn và sau đó hàng loạt lại dữ liệu.

CREATE TEMP TABLE temp_table AS SELECT * FROM original_table;
DROP TABLE original_table;
CREATE TABLE original_table ...
INSERT INTO original_table SELECT * FROM temp_table;

Vấn đề duy nhất khi tạo lại bảng là bạn sẽ cần cấp lại quyền và nếu bảng quá lớn thì sẽ mất một khoảng thời gian.


1
Điều này khá giống với câu trả lời hiện có từ Wolli để đổi tên và sau đó sao chép dữ liệu bảng cũ vào lược đồ mới. Cả hai sẽ giữ thứ tự cột, nhưng giải pháp này với bảng tạm thời yêu cầu sao chép dữ liệu hai lần. Một lần để sao chép vào bảng tạm thời và một lần khác để sao chép trở lại bảng mới. Đổi tên bảng sẽ nhanh hơn bằng cách chỉ thực hiện một bản sao.
Matt Good

4
ALTER TABLE publisher_catalogs ADD COLUMN new_version integer;

update publisher_catalogs set new_version = CAST(version AS integer);
ALTER TABLE publisher_catalogs DROP COLUMN version RESTRICT;
ALTER TABLE publisher_catalogs RENAME new_version to version;

3

Redshift là cơ sở dữ liệu cột không cho phép bạn sửa đổi trực tiếp kiểu dữ liệu, tuy nhiên dưới đây là một cách tiếp cận điều này sẽ thay đổi thứ tự cột.

Các bước -

1. Bảng thay đổi thêm cột mới vào bảng 2. Cập nhật giá trị cột mới với giá trị cột cũ 3. Bảng thay đổi để bỏ bảng 4. thay đổi cột cũ để đổi tên cộtn thành cột cũ

Nếu bạn không muốn thay đổi thứ tự của các cột thì giải pháp sẽ là

1. tạo bảng tạm với tên cột mới

  1. sao chép dữ liệu từ bảng cũ sang bảng mới.

  2. bỏ bàn cũ

  3. đổi tên bảng mới thành bảng cũ

  4. Một điều quan trọng là tạo một bảng mới bằng lệnh like thay vì tạo đơn giản.


2

Phương thức này hoạt động để chuyển đổi một cột int (lớn) thành một varchar

-- Create a backup of the original table
create table original_table_backup as select * from original_table;

-- Drop the original table, and then recreate with new desired data types
drop table original_table;

create table original_table (
  col1 bigint,
  col2 varchar(20) -- changed from bigint
);

-- insert original entries back into the new table
insert into original_table select * from original_table_backup;

-- cleanup
drop original_table_backup;

0

UNLOADCOPY với chiến lược đổi tên bảng nên là cách hiệu quả nhất để thực hiện thao tác này nếu việc giữ lại cấu trúc bảng (thứ tự hàng) là quan trọng.

Đây là một ví dụ thêm vào câu trả lời này .

BEGIN TRANSACTION;

ALTER TABLE <TABLE_NAME> RENAME TO <TABLE_NAME>_OLD;
CREATE TABLE <TABLE_NAME> ( <NEW_COLUMN_DEFINITION> );
UNLOAD ('select * from <TABLE_NAME>_OLD') TO 's3://bucket/key/unload_' manifest;
COPY <TABLE_NAME> FROM 's3://bucket/key/unload_manifest'manifest;

END TRANSACTION;

-2

để cập nhật cùng một cột trong redshift, điều này sẽ hoạt động tốt

UPDATE table_name 
SET column_name = 'new_value' WHERE column_name = 'old_value'

bạn có thể có nhiều mệnh đề ở đâu bằng cách sử dụng và, để loại bỏ bất kỳ sự nhầm lẫn nào cho sql

chúc mừng !!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.