はじめに
テーブルに列を追加した場合は、スーパープロジェクションには必ず列が追加されます。しかし、クエリスペシフィックプロジェクションには、ALTER TABLEコマンドのオプションを付けなければ、列は追加されません。
本記事は、ALTER TABLEコマンドで、プロジェクションに列を追加する場合の動作をご紹介します。
構文
[テーブルに列を追加する構文]
オプションを指定して、プロジェクションに列を追加できます。
ALTER TABLE <テーブル名> ADD COLUMN <列名> <データ型> ・・・
[PROJECTIONS (プロジェクション名,プロジェクション名,・・・) | ALL PROJECTIONS];
[オプション]
オプション名 | 概要 |
|---|---|
指定無し(デフォルト) | オプションを指定しない場合、スーパープロジェクションのみに列が追加されます。 |
PROJECTIONS | 列を追加したいプロジェクション名を指定します。(複数指定可) |
ALL PROJECTIONS | 全てのプロジェクションに列を追加する場合は、このオプションを選択します。 |
実行例
スーパープロジェクションのみに列を追加する場合(指定無し(デフォルト))
スーパープロジェクションのみに列を追加する場合はオプション無しで実行します。この場合、スーパープロジェクションのみに列が追加されます。
※スーパープロジェクションは、テーブルに1件以上データを追加した段階で作成されます。
■testテーブルのプロジェクションを確認
dbadmin=> SELECT projection_name, is_super_projection
dbadmin-> FROM projections
dbadmin-> WHERE anchor_table_name = 'test';
projection_name | is_super_projection
-----------------+---------------------
test_sp | t /* スーパープロジェクション */
test_qsp_01 | f /* クエリスペシフィックプロジェクション */
test_qsp_02 | f /* クエリスペシフィックプロジェクション */
(4 rows)■スーパープロジェクションとクエリスペシフィックプロジェクションの列を確認
dbadmin=> SELECT projection_name, LISTAGG(projection_column_name) columns
dbadmin-> FROM projection_columns
dbadmin-> WHERE table_name = 'test'
dbadmin-> GROUP BY projection_name ORDER BY projection_name;
projection_name | columns
-----------------+---------
test_sp | c1,c2 /* スーパープロジェクションの列 */
test_qsp_01 | c1 /* クエリスペシフィックプロジェクションの列 */
test_qsp_02 | c1 /* クエリスペシフィックプロジェクションの列 */
(4 rows)■testテーブルにc3列を追加
dbadmin=> ALTER TABLE test ADD COLUMN c3 INT;
ALTER TABLE■スーパープロジェクションとクエリスペシフィックプロジェクションの列を確認
dbadmin=> SELECT projection_name, LISTAGG(projection_column_name) columns
dbadmin-> FROM projection_columns
dbadmin-> WHERE table_name = 'test'
dbadmin-> GROUP BY projection_name ORDER BY projection_name;
projection_name | columns
-----------------+----------
test_sp | c1,c2,c3 /* c3列が追加された */
test_qsp_01 | c1 /* 変更なし */
test_qsp_02 | c1 /* 変更なし */
(4 rows)特定のプロジェクションに列を追加する場合(PROJECTIONS)
特定のプロジェクションに列を追加したい場合は、PROJECTIONS オプションでプロジェクション名を指定します。このオプションでは指定したプロジェクションとスーパープロジェクションに列が追加されます。
■testテーブルのプロジェクションを確認
dbadmin=> SELECT projection_name, is_super_projection
dbadmin-> FROM projections
dbadmin-> WHERE anchor_table_name = 'test';
projection_name | is_super_projection
-----------------+---------------------
test_sp | t /* スーパープロジェクション */
test_qsp_01 | f /* クエリスペシフィックプロジェクション */
test_qsp_02 | f /* クエリスペシフィックプロジェクション */
(4 rows)■スーパープロジェクションとクエリスペシフィックプロジェクションの列を確認
dbadmin=> SELECT projection_name, LISTAGG(projection_column_name) columns
dbadmin-> FROM projection_columns
dbadmin-> WHERE table_name = 'test'
dbadmin-> GROUP BY projection_name ORDER BY projection_name;
projection_name | columns
-----------------+---------
test_sp | c1,c2 /* スーパープロジェクションの列 */
test_qsp_01 | c1 /* クエリスペシフィックプロジェクションの列 */
test_qsp_02 | c1 /* クエリスペシフィックプロジェクションの列 */
(4 rows)■PROJECTIONSオプションを指定し、testテーブルにc3列を追加
dbadmin=> ALTER TABLE test ADD COLUMN c3 INT
dbadmin=> PROJECTIONS(test_qsp_01);
ALTER TABLE■スーパープロジェクションとクエリスペシフィックプロジェクションの列を確認
dbadmin=> SELECT projection_name, LISTAGG(projection_column_name) columns
dbadmin-> FROM projection_columns
dbadmin-> WHERE table_name = 'test'
dbadmin-> GROUP BY projection_name ORDER BY projection_name;
projection_name | columns
-----------------+----------
test_sp | c1,c2,c3 /* c3列が追加された */
test_qsp_01 | c1,c3 /* c3列が追加された */
test_qsp_02 | c1 /* 変更なし */
(4 rows)テーブルの全てのプロジェクションに列を追加する場合(ALL PROJECTIONS)
テーブルの全てのプロジェクションに列を追加したい場合は、ALL PROJECTIONS オプションを指定します。このオプションではテーブルに作成されている全てのプロジェクションとスーパープロジェクションに列が追加されます。
■testテーブルのプロジェクションを確認
dbadmin=> SELECT projection_name, is_super_projection
dbadmin-> FROM projections
dbadmin-> WHERE anchor_table_name = 'test';
projection_name | is_super_projection
-----------------+---------------------
test_sp | t /* スーパープロジェクション */
test_qsp_01 | f /* クエリスペシフィックプロジェクション */
test_qsp_02 | f /* クエリスペシフィックプロジェクション */
(4 rows)■スーパープロジェクションとクエリスペシフィックプロジェクションの列を確認
dbadmin=> SELECT projection_name, LISTAGG(projection_column_name) columns
dbadmin-> FROM projection_columns
dbadmin-> WHERE table_name = 'test'
dbadmin-> GROUP BY projection_name ORDER BY projection_name;
projection_name | columns
-----------------+---------
test_sp | c1,c2 /* スーパープロジェクションの列 */
test_qsp_01 | c1 /* クエリスペシフィックプロジェクションの列 */
test_qsp_02 | c1 /* クエリスペシフィックプロジェクションの列 */
(4 rows)■ALL PROJECTIONSオプションを指定し、testテーブルにc3列を追加
dbadmin=> ALTER TABLE test ADD COLUMN c3 INT ALL PROJECTIONS;
ALTER TABLE■スーパープロジェクションとクエリスペシフィックプロジェクションの列を確認
dbadmin=> SELECT projection_name, LISTAGG(projection_column_name) columns
dbadmin-> FROM projection_columns
dbadmin-> WHERE table_name = 'test'
dbadmin-> GROUP BY projection_name ORDER BY projection_name;
projection_name | columns
-----------------+----------
test_sp | c1,c2,c3 /* c3列が追加された */
test_qsp_01 | c1,c3 /* c3列が追加された */
test_qsp_02 | c1,c3 /* c3列が追加された */
(4 rows)注意事項
・ライブアグリゲートプロジェクションに列を追加することはできません。
・ALTER TABLE文の”ALL PROJECTIONS”はVertica9.2.1から使用可能です。
・追加した列をプロジェクションのセグメントキーやOrder byに含める場合は、プロジェクションの再作成が必要です。
参考情報
プロジェクションの概要
https://www.ashisuto.co.jp/cm/analytics-database/projection-description.html
ALTER TABLE
https://docs.vertica.com/25.1.x/en/sql-reference/statements/alter-statements/alter-table/
列追加/削除時のエラーを回避する方法(Vertica9.2新機能)
https://www.ashisuto.co.jp/cm/analytics-database/column_exists.html
テーブルの任意の位置に列を追加する方法
https://www.ashisuto.co.jp/cm/analytics-database/table_add_column.html
検証バージョンについて
この記事の内容はVertica 25.1で確認しています。
更新履歴
2025/03/11 関連記事を本記事に統合、一部内容修正
2019/12/26 カテゴリを修正
2019/09/18 本記事を公開