如何更改 Amazon Redshift 数据库中的列数据类型?
我无法更改 Redshift 中的列数据类型;有什么方法可以修改 Amazon Redshift 中的数据类型?
如何更改 Amazon Redshift 数据库中的列数据类型?
我无法更改 Redshift 中的列数据类型;有什么方法可以修改 Amazon Redshift 中的数据类型?
如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;
(最近更新)可以在 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;
Redshift 是列式数据库,不允许您直接修改数据类型,但下面是一种更改列顺序的方法。
脚步 -
1.Alter table add newcolumn to the table 2.Update the newcolumn value with oldcolumn value 3.Alter table to drop the oldcolumn 4.alter table to rename the columnn to oldcolumn
如果您不想更改列的顺序,那么解决方案是
1.使用新列名创建临时表
将旧表中的数据复制到新表中。
丢弃旧表
将新表重命名为旧表
一件重要的事情是使用类似命令而不是简单的创建来创建一个新表。
您可以使用以下语句:
ALTER TABLE <table name --etl_proj_atm.dim_card_type >
ALTER COLUMN <col name --card_type> type varchar(30)
如果保留表结构(行顺序)很重要,使用表重命名策略的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;
对于更新 redshift 中的同一列,这可以正常工作
UPDATE table_name
SET column_name = 'new_value' WHERE column_name = 'old_value'
你可以在where中使用and来设置多个子句,以消除对sql的任何混淆
干杯!!