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?
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?
Câu trả lời:
Như đã lưu ý trong tài liệu ALTER TABLE , bạn có thể thay đổi độ dài của VARCHAR
cá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 COPY
câu lệnh, hãy ghi nhớ điều đó - bạn có thể xác định thứ tự cột bằng COPY
)
để 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;
drop table
truy vấn sẽ hiển thị các lỗi phụ thuộc có thể được nhưng không nên bỏ qua.
INSERT INTO <TABLE_NAME> SELECT * FROM <TABLE_NAME>_OLD;
(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
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.
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;
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
sao chép dữ liệu từ bảng cũ sang bảng mới.
bỏ bàn cũ
đổi tên bảng mới thành bảng cũ
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.
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;
UNLOAD và COPY 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;
để 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 !!