はじめに

テーブル名を変更するRENAMEコマンドをご紹介します。
通常、テーブル名のRENAMEを行う際、1回のコマンドで1つのテーブルをRENAMEするのが一般的です。
Verticaでは、それに加えて1回のコマンドで複数のテーブルのRENAME処理をする事ができます。
例えば、データベースサーバでバッチ処理を行う際にテーブルの洗い替えを行うケースがありますが、
そのような場合に使える便利なコマンドです。


コマンド構文

・1つのテーブルのテーブル名を変更する場合


上記の例では、T1_oldという名前のテーブルをT1_newという名前に変更しています。


・複数のテーブルのテーブル名を変更する場合(基本編)


上記の例では、T1_oldとT2_oldいう名前の2つのテーブルを、T1_newとT2_newいう名前に変更しています。

・複数のテーブルのテーブル名を変更する場合(応用編①)


上記の例では、T1、T1_bk、T1_workいう名前の3つのテーブルを、T1_bk、T1_work、T1いう名前に変更しています。これについて、補足します。
データベースサーバでバッチ処理を行う際に、1つのテーブルの洗い替えを行うために、3種類のテーブルを用意するケースがあります。
以下の図は、これらの3つのテーブルをRENAMEさせるイメージを示しています。

%e3%83%86%e3%83%bc%e3%83%96%e3%83%ab%e3%81%8f%e3%82%8b%e3%82%8a%e3%82%931

各テーブルの役割は以下のような想定をしています。

テーブル名役割
T1アプリが参照するテーブル。
いわゆる本番テーブル。
T1_bkバックアップとしてキープされたテーブル。
洗い替え処理をする1つ前の世代のT1テーブル。
T1_work最新データのロード先となるテーブル。
洗い替え処理後に本番テーブルとなるテーブル。


1回のコマンドで複数のテーブルをRENAMEする事で、1つ1つのテーブルに対してRENAMEコマンドを発行する場合と比べて、コマンドの合間にできる僅かな空白をなくす事ができます。

・複数のテーブルのテーブル名を変更する場合(応用編②)


上述の「複数のテーブルのテーブル名を変更する場合(応用編①)」と似た方法ですが、実存しない一時的なテーブルを使っている点が異なります。
上記の例では、実存しない一時的なテーブルであるtempsを使う事で、実存するテーブルであるT1とT2を1回のコマンドで入れ替えています。
以下の図は、これらの2つのテーブルをRENAMEさせるイメージを示しています。

%e3%83%86%e3%83%bc%e3%83%96%e3%83%ab%e3%81%8f%e3%82%8b%e3%82%8a%e3%82%932

先と同様に、1回のコマンドで複数のテーブルをRENAMEする事で、1つ1つのテーブルに対してRENAMEコマンドを発行する場合と比べて、コマンドの合間にできる僅かな空白をなくす事ができます。

補足

複数のテーブルをRENAMEする際の注意すべきポイントを以下にまとめます。

・ALTER TABLEコマンドでリストするテーブルの順序
RENAME前のテーブルとRENAME後のテーブルをRENAMEコマンドにリストする際、そのテーブルの数と順序を一致させる必要があります。

・RENAME TOの後にリストするテーブル名には、スキーマ名を修飾する事はできません。
同一のスキーマ内でのRENAME処理だけをVerticaが許可するためです。

・コマンドの構文にミスがあった状態で実行した場合、そのコマンドは部分的に実行される事はありません。
例えば、コマンドに指定したRENAME前とRENAME後のテーブル数が一致しない状態で実行してしまった場合、テーブルがRENAMEされる事はありません。

・RENAMEをしても、プロジェクションとの関係性に影響はありません。
プロジェクションはテーブルのOIDと紐付いていますので、テーブル名が変わってもプロジェクションとの関係に影響はありません。
(最適化したプロジェクションの状態やユーザに付与したテーブルへの参照権限も継承されます。)

検証バージョンについて

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