Amazon Redshift: CREATE文/DROP文にIF構文が利用出来るようになりました

2014.10.27

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

先日ご紹介した以下エントリと同じタイミングで、CREATE文及びDROP文に対してIF構文がオプションとして利用出来るようになりました。当エントリではその内容についてサラッとですがご紹介したいと思います。

目次

『存在していなければ作成(CREATE)する』IF NOT EXISTSオプション

まずはこちら。『存在していなければ作成(CREATE)する』IF NOT EXISTSオプションの確認です。検証用にスキーマとテーブルを作成し、

# CREATE SCHEMA ifclausetest;
CREATE SCHEMA
# CREATE TABLE ifclausetest.iftable01 (id INT NOT NULL, NAME VARCHAR(100) NOT NULL);
CREATE TABLE

上記で作成したテーブルを再度作成試みてみます。実行文がERRORとして処理されました。

# CREATE TABLE ifclausetest.iftable01 (id INT NOT NULL, NAME VARCHAR(100) NOT NULL);
ERROR:  Relation "iftable01" already exists

一方、以下はIF NOT EXISTSオプションを付与した例。作成しようとしたテーブルは存在している為、処理がスキップされた形となりました。メッセージのレベルもINFOとなっています。形としては正常に処理された体となっています。

# CREATE TABLE ifclausetest.iftable02 (id INT NOT NULL, NAME VARCHAR(100) NOT NULL);
CREATE TABLE
#
# CREATE TABLE
# IF NOT EXISTS
# ifclausetest.iftable02 (id INT NOT NULL, NAME VARCHAR(100) NOT NULL);
INFO:  Relation "iftable02" already exists and will be skipped
CREATE TABLE

『存在していれば削除(DROP)する』IF EXISTSオプション

次いでこちらのオプション。先程とは逆で『既に存在していれば削除(DROP)する』というものです。

まずはこれまで通り複数回実行してみます。ERRORとして処理されますね。

# DROP TABLE ifclausetest.iftable02;
DROP TABLE
# DROP TABLE ifclausetest.iftable02;
ERROR:  Table "iftable02" does not exist
#

今度はIF EXISTSオプションを付与して実行してみます。前項のIF NOT EXISTSオプションと同様に、処理がスキップされ、INFOとして処理されました。

# DROP TABLE ifclausetest.iftable01;
DROP TABLE
# DROP TABLE
# IF EXISTS
# ifclausetest.iftable01;
INFO:  Table "iftable01" does not exist and will be skipped
DROP TABLE
#

まとめ

以上、Amazon RedshiftでのCREATE/DROP文実行に於ける『IF (NOT) EXISTS』オプションに関するご紹介でした。ちなみにこのオプションはどのような局面で利用するのでしょう?

オプション付与で実行した際にはエラー(ERROR)とならずに正常に処理された形(INFO:内情は処理をスキップ)でエラーを回避している為、何らかプログラム上で一連の処理が実行された際、想定していない局面だったら回避する...様な使い方を想定しているのでしょうか。今回は対象を『テーブル』として実施検証してみましたが、その他の要素も含めてプログラム上で自動で処理させるような局面、または近しい様な局面に遭遇した際はこのオプションの利用を検討してみてはいかがでしょうか?こちらからは以上です。