BigQuery の ALTER 文でテーブル名が変更できるようになったので挙動を確認してみた!

2021.05.20

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

こんにちは、みかみです。

BigQuery の 2021/05/19 のリリースで、ALTER TABLE 文でのテーブ名の変更が GA( General Availability )になりました!(待ってましたー!><v

「あれ? BigQuery ってテーブル名変更できなかったの?」な感じかもしれませんが、

はい。。これまで既存テーブル名の変更はできなかったんです。。><。

テーブル名を変えたい場合には、テーブルコピーで新しいテーブルを作成&元テーブルを削除する必要があり、ちょっと手間がかかりました。

現時点では、既存のテーブルの名前を変更することはできません。テーブル名を変更する場合は、テーブルをコピーする手順に従います。コピー オペレーションでコピー先テーブルを指定する際に新しいテーブル名を使用します。

今回のリリースで ALTER TABLE 構文で、テーブル名を直接変更できるようになったということなので、さっそくためしてみます!

テーブル名を変更してみる

テーブル名を変更するには、他のデータベースと同じ ALTER TABLE [テーブル名] RENAME TO [新テーブル名] を実行すれば良いようです。

※2021/05/20 現在、日本語の公式ドキュメントには、まだ ALTER TABLE RENAME TO の項目はありませんでした。

datset_1.dogs_20210512 テーブルの名前を、datset_1.dogs_rename にリネームしてみます。

以下の SQL を実行しました。

ALTER TABLE dataset_1.dogs_20210512 RENAME TO dogs_renamed

変更できたようなので、実際のテーブル情報も確認してみます。

ちゃんと変更できてます!

ALTER TABLE RENAME TO 構文では、IF EXISTS もサポートされています。

また、パーティショニングやクラスタリング設定のあるテーブルでも、問題なくリネームできることが確認できました!

制限事項

現在のところ、以下のテーブルのリネームはできない、またはタイミングの考慮が必要とのことです。

  • 外部テーブル
  • 行レベルのアクセスポリシーがあるテーブル
  • ストリーミングインサートでデータが取り込まれているテーブル

Caveats:
・You cannot use this statement to rename an external table.
・A table that has row-level access policies cannot be renamed.
・If you change table policies or row-level access policies when you rename the table, then those changes might not be effective.
・If you want to rename a table that has data streaming into it, you must stop the streaming and wait for BigQuery to indicate that streaming is not in use.

ためしに、外部テーブルの名前を変更しようとしてみると

テーブル種別が外部テーブルなのでリネームできない旨のエラーメッセージが表示されました。

通常テーブルしかリネームできないとのことで、テーブル種別が VIEW の場合も、やはり同様にまだリネームはサポートされていませんでした。

CLI から変更できる?

bq コマンドでテーブル名変更のコマンドオプションが追加されていないか、 SDK を更新して --helpを表示して確認してみましたが、 まだそれらしきオプションは見つかりませんでした。

mikami_yuki@cloudshell:~ (cm-da-mikami-yuki-258308)$ bq version
This is BigQuery CLI 2.0.68

とはいえ、bq query を使えば CLI から SQL が実行できるので、ALTER TABLE 文実行で CLI からもテーブル名の変更ができるようになりました。

mikami_yuki@cloudshell:~ (cm-da-mikami-yuki-258308)$ bq query --use_legacy_sql=false 'ALTER TABLE dataset_1.dogs_renamed RENAME TO dogs_rn_from_cli'
Waiting on bqjob_r30f72dc21d3721ac_000001798954cf51_1 ... (0s) Current status: DONE
Altered cm-da-mikami-yuki-258308.dataset_1.dogs_renamed

カラム名は変更できる?

BigQuery では、昨年末から今年にかけて、テーブルカラムの追加や削除、カラムの NOT NULL 制約の解除も ALTER TABLE 文で実行できるようになりました。

テーブル名が変更できるようになったし、もしやカラム名も?

と思って US リージョンのテーブルで確認してみましたが、カラム名の変更はやはりまだサポートされていませんでした。(そりゃそうですな。。

ここのところの ALTER 文サポート追加ラッシュからしても、カラム名の変更ももうすぐサポート開始されるのではないかと期待大ですが、 もうしばらくはこれまで通り、別テーブル作成にて対応する必要がありそうです。

まとめ(所感)

SQL での処理の幅が広がって、ますます使いやすくなった BigQuery です!

ALTER 文でのテーブル名変更のサポート開始により、他データベースからの移行やバッチ処理などの効率も上がるのではないかと思います。

ここのところの ALTER 文サポート追加ラッシュからしても、カラム名の変更ももうすぐサポート開始されるのではないかと期待大です!(2回言ってみましたw

参考