Amazon Redshiftデータベースの列データ型を変更するにはどうすればよいですか?
Redshiftで列のデータ型を変更することはできません。 Amazon Redshiftでデータ型を変更する方法はありますか?
現在、redshiftデータベースの列を変更する方法はありません。
正しいデータ型の新しい列を追加し、古い列のすべてのデータを新しい列に挿入して、最後に古い列を削除するだけです。
次のようなコードを使用します。
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の最近の更新(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コマンドで変更できる列は1つだけです。トランザクションブロックでALTER COLUMNを使用することはできません(BEGIN ... END)。
列の順序を変更したくないの場合、オプションは一時テーブルを作成し、目的のサイズの新しいテーブルをドロップして作成し、データを再度バルクします。
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;
(最近の更新)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
カラムナーデータベースであるRedshiftでは、データ型を直接変更することはできませんが、列の順序を変更する方法の1つを次に示します。
手順-
1.テーブルに新しい列を追加する変更テーブル2.古い列の値で新しい列の値を更新する3.古い列を削除するために変更するテーブル
列の順序を変更したくない場合、解決策は
1.新しい列名で一時テーブルを作成する
古いテーブルから新しいテーブルにデータをコピーします。
古いテーブルをドロップ
newtableの名前をoldtableに変更します
1つの重要なことは、simple createではなくlikeコマンドを使用して新しいテーブルを作成することです。
このメソッドは、(大きな)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;