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;
drop table
クエリが可能依存関係のエラーが表示されますが、バイパスすべきではありません。
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;
テーブルを再作成する際の唯一の問題は、アクセス許可を再度付与する必要があることです。テーブルが大きすぎると、時間がかかります。
Redshiftは列型データベースであるため、データ型を直接変更することはできませんが、以下は列の順序を変更する1つのアプローチです。
手順-
1.テーブルを変更してテーブルにnewcolumnを追加します2.newcolumn値をoldcolumn値で更新します3.テーブルを変更してoldcolumnを削除します4.テーブルを変更してcolumnnの名前をoldcolumnに変更します
列の順序を変更したくない場合、解決策は次のようになります。
1.新しい列名で一時テーブルを作成します
古いテーブルから新しいテーブルにデータをコピーします。
古いテーブルをドロップ
newtableの名前をoldtableに変更します
重要なことの1つは、単純な作成ではなく、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;
テーブル構造(行の順序)を保持することが重要な場合は、テーブルの名前変更戦略を使用した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;