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