更改Amazon Redshift中的列数据类型

时间:2013-06-14 05:51:36

标签: amazon-web-services amazon-redshift

如何更改Amazon Redshift数据库中的列数据类型?

我无法在Redshift中更改列数据类型;有没有办法在Amazon Redshift中修改数据类型?

11 个答案:

答案 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日)

  1. 允许更改仅varchar类型的列。
  2. 您只能增加字段的长度。您不能减少它。
  3. Alter列不能在事务块内运行。 (再见迁移脚本)

从文档中, 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.使用新列名称创建临时表

  1. 将数据从旧表复制到新表。

  2. 删除旧表

  3. 将newtable重命名为oldtable

  4. 使用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)

如果保留表结构(行顺序)很重要,则使用表重命名策略

UNLOADCOPY应该是最有效的方法

以下是添加到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

的任何混淆

欢呼声!!