Amazon Redshift:ALTER TABLE文でVARCHAR型の桁数を増やせるようになりました

2019.03.08

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

小ネタです。

Amazon Redshiftのメンテナンスアップデートにて、You can now use the ALTER TABLE command to increase the size of VARCHAR columns.(ALTER TABLEコマンドを使用してVARCHAR列のサイズを増やすことが出来るようになります)というものがありましたので試してみました。

なお、検証は管理コンソールにて現時点でのクラスタ最新バージョンにアップグレードを行った上で行っています。

コマンド1つでVARCHAR型の桁数定義を変更(増分)可能に

検証用に、簡易ではありますが以下テーブルを用意しました。

$ CREATE TABLE public.altertabletest (
  id INT NOT NULL,
  username VARCHAR(10) NOT NULL,
  userage SMALLINT,
  birthday DATE, prefcode CHAR(2)
);
CREATE TABLE

$ INSERT INTO public.altertabletest VALUES (1, 'AAA', 10, '2009/01/01', '10');
INSERT 0 1
$ INSERT INTO public.altertabletest VALUES (2, 'BBB', 20, '1999/01/01', '20');
INSERT 0 1
$ INSERT INTO public.altertabletest VALUES (3, 'CCC', 30, '1989/01/01', '30');
INSERT 0 1
$ \d public.altertabletest;
        Table "public.altertabletest"
  Column  |         Type          | Modifiers 
----------+-----------------------+-----------
 id       | integer               | not null
 username | character varying(10) | not null
 userage  | smallint              | 
 birthday | date                  | 
 prefcode | character(2)          | 

#

構文に従い、ALTER TABLE文を実行。桁数を増やすことが出来ました。

# このクエリでvarcharの大きさ変更が出来ます.
$ ALTER TABLE public.altertabletest ALTER COLUMN username TYPE VARCHAR(20);
ALTER TABLE
# \d public.altertabletest;
        Table "public.altertabletest"
  Column  |         Type          | Modifiers 
----------+-----------------------+-----------
 id       | integer               | not null
 username | character varying(20) | not null
 userage  | smallint              | 
 birthday | date                  | 
 prefcode | character(2)          | 

#

桁数を減らしたり、VARCHAR型の桁数上限(65535)を超えるような指定はエラーとなります。

$ ALTER TABLE public.altertabletest ALTER COLUMN username TYPE VARCHAR(18);
ERROR:  cannot alter column "username" of relation "altertabletest", target column size 18 should be larger than original column size 20
$ ALTER TABLE public.altertabletest ALTER COLUMN username TYPE VARCHAR(70000);
ERROR:  Column length exceeds maximum allowed (maximum column length is 65535)

また、今回対象となっているデータ型はVARCHAR型のみとなります。その他のデータ型カラムを指定してみましたが以下のようにエラーとなりました。

$ ALTER TABLE public.altertabletest ALTER COLUMN userage TYPE BIGINT;
ERROR:  cannot alter column "userage" of relation "altertabletest"
$ ALTER TABLE public.altertabletest ALTER COLUMN birthday TYPE TIMESTAMP;
ERROR:  cannot alter column "birthday" of relation "altertabletest"
$ ALTER TABLE public.altertabletest ALTER COLUMN prefcode TYPE CHAR(4);
ERROR:  cannot alter column "prefcode" of relation "altertabletest"

まとめ

という訳でAmazon Redshiftの機能拡張「ALTER TABLE文でVARCHAR型の桁数が増やせるように」の内容ご紹介でした。従来の手法の場合、定義変更されたテーブル定義を用いて別途CREATE TABLE文でテーブル作成(_new)し、データを入れ替える(無印テーブルを_oldにリネーム後_newテーブルを無印テーブルにリネーム)...という形を取る必要がありましたが、「VARCHAR型カラムの桁数増加」のみであればこの様な作業をしなくてもコマンド一発で変更出来るので便利になりますね!(※CHAR型や数値型についても同様の変更が可能になるともっと嬉しいかな、とも思います。)