如何更改Amazon Redshift数据库中的列数据类型?
我无法在Redshift中更改列数据类型;有没有办法在Amazon Redshift中修改数据类型?
答案 0 :(得分:117)
目前无法更改红移数据库中的列。
我能想到的是添加一个具有正确数据类型的新列,然后将旧列中的所有数据插入到新列中,最后删除旧列。
使用类似的代码:
ALTER TABLE t1 ADD COLUMN new_column (___correct_column_definition___);
UPDATE t1 SET new_column = column;
ALTER TABLE t1 DROP COLUMN column;
ALTER TABLE t1 RENAME COLUMN new_column TO column;
将会有架构更改 - 新添加的列将在表格的最后一行(这可能是COPY
语句的问题,请记住这一点 - 您可以使用{{1}定义列顺序})
答案 1 :(得分:37)
避免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;
答案 2 :(得分:7)
如果您不想更改列顺序,则选项将创建临时表,drop&amp;创建具有所需大小的新组件,然后再次批量处理数据。
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;
重新创建表的唯一问题是您需要再次授予权限,如果表格太大,则需要一段时间。
答案 3 :(得分:4)
Redshift的最新更新(截至2019年3月15日)
从文档中, https://docs.aws.amazon.com/redshift/latest/dg/r_ALTER_TABLE.html
ALTER COLUMN column_name TYPE new_data_type
增加的子句 使用VARCHAR数据类型的列的大小。您可以使用ALTER COLUMN仅与VARCHAR一起使用。您可以增加VARCHAR的大小 列,但您不能减少它。您不能更改具有以下内容的列 主键,外键或唯一约束。您只能更改 每个ALTER TABLE命令中的一列。您不能在其中使用ALTER COLUMN 一个交易块(BEGIN ... END)。
答案 4 :(得分:3)
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;
答案 5 :(得分:2)
Redshift是柱状数据库,不允许您直接修改数据类型, 但是下面是一种方法,这将改变列顺序。
步骤 -
1.Alter table将newcolumn添加到表中 2.使用oldcolumn值更新newcolumn值 3.更改旧表的删除表 4.alter table将columnn重命名为oldcolumn
如果您不想改变列的顺序,那么解决方案就是
1.使用新列名称创建临时表
将数据从旧表复制到新表。
删除旧表
将newtable重命名为oldtable
使用like命令创建一个新表,而不是简单的创建。
答案 6 :(得分:1)
此方法适用于将(大)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;
答案 7 :(得分:0)
(最新更新)可以在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)
这里是文档link
答案 8 :(得分:0)
以下是添加到this答案中的示例。
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;
答案 9 :(得分:0)
您可以使用以下语句:
ALTER TABLE <table name --etl_proj_atm.dim_card_type >
ALTER COLUMN <col name --card_type> type varchar(30)
答案 10 :(得分:-1)
用于更新redshift中的相同列,这样可以正常工作
UPDATE table_name
SET column_name = 'new_value' WHERE column_name = 'old_value'
你可以在where中使用和使用多个子句,以便消除对sql
的任何混淆欢呼声!!