目次
はじめに
カラムを追加・削除する際、通常の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]を検出させます。
1 |
ALTER TABLE テーブル名 ADD COLUMN IF NOT EXISTS カラム名 データ型; |
指定したカラムが存在すればそのカラムを削除し、存在しなければ[NOTICE]を検出させます。
1 |
ALTER TABLE テーブル名 DROP COLUMN IF NOT EXISTS カラム名; |
使用例
testテーブルに対して、すでに存在するcol1カラムを追加するALTER TABLE~ADD COLUMN文を実行します。IF NOT EXISTS句を付けない場合、IF NOT EXISTS句を付けた場合をそれぞれ確認します。
テーブル情報の確認
1 2 3 4 5 6 |
dbadmin=> \d test List of Fields by Tables Schema | Table | Column | Type | Size | Default | Not Null | Primary Key | Foreign Key --------+-------+--------+---------+------+---------+----------+-------------+------------- public | test | col1 | char(1) | 1 | | f | f | (1 row) |
IF NOT EXISTS句を付けない場合
1 2 |
dbadmin=> ALTER TABLE test ADD COLUMN col1 varchar2(10); ROLLBACK 3145: Duplicate column name |
[ROLLBACK 3145]エラーが検知されています。
NOT EXISTS句を付けた場合
1 2 3 |
dbadmin=> ALTER TABLE test ADD COLUMN IF NOT EXISTS col1 varchar2(10); NOTICE 8778: Duplicate column name; nothing was done ALTER TABLE |
[NOTICE 8778]が検知されています。
「 ALTER TABLE テーブル名 DROP COLUMN IF NOT EXISTS カラム名」を使用し、指定したカラムが存在しなかった場合も同様の動作となります。
[ROLLBACK 3145]と[NOTICE 8778]の違い
エラー検知を有効にした際に、動作に差が出ます。スクリプト内に、エラー検知を有効にする記述をしておくと、[ROLLBACK 3145]が検知された際は処理が中断されますが、
[NOTICE 8778]はINFOレベルの情報なため、処理が続行されます。
エラー検知を有効にするコマンドをご案内します。ON_ERROR_STOPの詳細については参考情報をご確認ください。
1 |
\set ON_ERROR_STOP ON |
参考情報
SQL Functions and Statementshttps://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