web-dev-qa-db-ja.com

Amazon Redshiftの列データ型を変更する

Amazon Redshiftデータベースの列データ型を変更するにはどうすればよいですか?

Redshiftで列のデータ型を変更することはできません。 Amazon Redshiftでデータ型を変更する方法はありますか?

73
user1485267

現在、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で列の順序を定義できます)

122

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;
37
Wolli

Redshiftの最近の更新(2019年3月15日現在)

  1. varchar型のみの列を変更できます。
  2. フィールドの長さのみを増やすことができます。減らすことはできません。
  3. 列の変更は、トランザクションブロック内では実行できません。 (さようなら移行スクリプト)

ドキュメントから 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)。

7
nightgaunt

列の順序を変更したくないの場合、オプションは一時テーブルを作成し、目的のサイズの新しいテーブルをドロップして作成し、データを再度バルクします。

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;

テーブルを再作成する唯一の問題は、アクセス許可を再度付与する必要があり、テーブルが大きすぎる場合は時間がかかることです。

7
Franzi
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;
4
Anand Kumar

(最近の更新)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

2
user0000

カラムナーデータベースであるRedshiftでは、データ型を直接変更することはできませんが、列の順序を変更する方法の1つを次に示します。

手順-

1.テーブルに新しい列を追加する変更テーブル2.古い列の値で新しい列の値を更新する3.古い列を削除するために変更するテーブル

列の順序を変更したくない場合、解決策は

1.新しい列名で一時テーブルを作成する

  1. 古いテーブルから新しいテーブルにデータをコピーします。

  2. 古いテーブルをドロップ

  3. newtableの名前をoldtableに変更します

  4. 1つの重要なことは、simple createではなくlikeコマンドを使用して新しいテーブルを作成することです。

2
Rama krishna

このメソッドは、(大きな)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;
1
comfytoday