如何更改Amazon Redshift数据库中的列数据类型?
我无法在Redshift中更改列数据类型;有什么方法可以修改Amazon Redshift中的数据类型?
Answers:
如ALTER TABLE文档中所述,您可以VARCHAR
使用
ALTER TABLE table_name
{
ALTER COLUMN column_name TYPE new_data_type
}
对于其他列类型,我能想到的就是添加具有正确数据类型的新列,然后将旧列中的所有数据插入到新列中,最后删除旧列。
使用类似于以下代码:
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;
将会发生模式更改-新添加的列将位于表的最后(这可能是COPY
语句的问题,请记住这一点-您可以使用定义列顺序COPY
)
为了避免Tomasz提到的架构更改:
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;
INSERT INTO <TABLE_NAME> SELECT * FROM <TABLE_NAME>_OLD;
(最新更新)可以在Redshift中更改varchar列的类型。
ALTER COLUMN column_name TYPE new_data_type
例:
CREATE TABLE t1 (c1 varchar(100))
ALTER TABLE t1 ALTER COLUMN c1 TYPE varchar(200)
这是文档链接
如果您不想更改列顺序,则可以选择创建一个临时表,然后拖放并创建具有所需大小的新表,然后再次批量处理数据。
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;
重新创建表的唯一问题是您将需要再次授予权限,如果表太大,则将花费一些时间。
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;
此方法适用于将(大)int列转换为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和COPY应该是最有效的方法如果保留表结构(行顺序)很重要,则执行此操作。
这是添加到此答案的示例。
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;