はじめに

カラムを追加・削除する際、通常のALTER TABLE ~ {ADD|DROP} COLUMN文を使用すると、以下の場合にROLLBACKエラーが発生します。

[ALTER TABLE ~ ADD COLUMN使用時]
既に存在するカラムと、同じ名前のカラムを追加しようとした場合

[ALTER TABLE ~ DROP COLUMN使用時]
存在しないカラムを削除しようとした場合

カラム追加のALTER TABLE文にはIF NOT EXISTS文を、カラム削除のALTER TABLE文にはIF EXISTS文を付与することで、
「既に存在するカラムを追加しようとする」処理、あるいは「存在しないカラムを削除しようとする」処理に対してROLLBACKエラーを発生させずにALTER TABLE文を実行できます。

構文と使用イメージをご案内します。

構文

指定したカラムが存在しなければカラムを作成し、既に存在すれば[NOTICE]を検出させます。

指定したカラムが存在すればそのカラムを削除し、存在しなければ[NOTICE]を検出させます。

使用例

testテーブルに対して、すでに存在するcol1カラムを追加するALTER TABLE~ADD COLUMN文を実行します。
IF NOT EXISTS句を付けない場合、IF NOT EXISTS句を付けた場合をそれぞれ確認します。

テーブル情報の確認

IF NOT EXISTS句を付けない場合

[ROLLBACK 3145]エラーが検知されています。

NOT EXISTS句を付けた場合

[NOTICE 8778]が検知されています。

「 ALTER TABLE テーブル名 DROP COLUMN IF NOT EXISTS カラム名」を使用し、指定したカラムが存在しなかった場合も同様の動作となります。

[ROLLBACK 3145]と[NOTICE 8778]の違い

エラー検知を有効にした際に、動作に差が出ます。
スクリプト内に、エラー検知を有効にする記述をしておくと、[ROLLBACK 3145]が検知された際は処理が中断されますが、
[NOTICE 8778]はINFOレベルの情報なため、処理が続行されます。

エラー検知を有効にするコマンドをご案内します。ON_ERROR_STOPの詳細については参考情報をご確認ください。


参考情報

SQL Functions and Statements
https://www.vertica.com/docs/9.2.x/HTML/Content/Authoring/NewFeatures/9.2/9.2.0/SQLandFunctions.htm

ON_ERROR_STOP
https://www.vertica.com/docs/9.2.x/HTML/Content/Authoring/ConnectingToVertica/vsql/Variables/ON_ERROR_STOP.htm

検証バージョンについて

この記事の内容はVertica 9.2で確認しています。