ALTER TABLE

テーブルのカラムとプロパティを変更します。

新しいカラムの追加、既存のカラムの削除、カラム名の変更、テーブル・プロパティの変更を行います。このコマンドは結果を返しません。

制約事項:
  • 変更できるのは、プライマリ・キーのクラスター化カラムの名前のみです。
  • カラムのデータ型は変更できません。
  • マテリアライズド・ビューを含むテーブルの場合、カラムがマテリアライズド・ビューで使用されていない場合でも、テーブルからそのカラムを削除することはできません。
  • 依存関係のあるセカンダリ・インデックスまたはDatastax Enterprise Searchインデックスを含むカラムについては、名前の変更または削除を行うことはできません。
  • データ型が異なる場合でも、既存のカラムと同じ名前でカラムを追加しないでください。これにより、コミット・ログの再生と、古いデータを含む既存のSSTableの破損が防止されます。
注: ALTER COLUMNFAMILYは廃止予定です。

構文

ALTER TABLE [keyspace_name.]table_name 
  [ ADD ( column_definition | column_definition_list ) [ , ... ] ]
  [ DROP column_name [ , ... ] ]
  [ RENAME column_name TO column_name ]
  [ WITH table_properties [ , ... ] ] ;
1. 凡例
構文規則 説明
大文字 リテラル・キーワード。
小文字 リテラル以外。
イタリック体 変数値。ユーザー定義値と置き換えます。
[] 任意。角かっこ( [] )で任意指定のコマンド引数を囲みます。角かっこは入力しないでください。
( ) グループ。丸かっこ(( ))は、選択肢を含むグループを示します。丸かっこは入力しないでください。
| または。縦棒( | )で代替要素を区切ります。要素のいずれかを入力してください。縦棒は入力しないでください。
... 繰り返し可能。省略記号(...)は、構文要素を必要な回数だけ繰り返すことができることを示します。
'Literal string' 単一引用符( ' )でCQL文内のリテラル文字を囲みます。大文字を維持するには、単一引用符を使用します。
{ key : value } マップ・コレクション。中かっこ( { } )でマップ・コレクションまたはキーと値のペアを囲みます。コロンでキーと値を区切ります。
<datatype1,datatype2> セット、リスト、マップ、またはタプル。山かっこ(< >)で、セット、リスト、マップまたはタプル内のデータ型を囲みます。データ型はコンマで区切ります。
cql_statement; CQL文の終了。セミコロン( ; )ですべてのCQL文を終了します。
[--] コマンドライン・オプションとコマンド引数は、2つのハイフン(--)。この構文は、引数がコマンドライン・オプションと間違われる可能性がある場合に役立ちます。
' <schema> ... </schema> ' 検索CQLのみ:単一引用符( ' )でXMLスキーマ宣言全体を囲みます。
@xml_entity='xml_entity_type' 検索CQLのみ:スキーマ・ファイルおよびsolrConfigファイル内のXML要素を上書きするための実体とリテラル値を示します。
ADD column_definition | ( column_definition_list )
1つ以上のカラムを追加して、カラムのデータ型を設定します。カラム名、データ型の順に指定します。カラム値は自動的にNullに設定されます。複数のカラムを追加するには、丸かっこ内にカラムのコンマ区切りリスト配置して使用します。
column_name cql_type [ , ]
[ column_name cql_type [ , ... ]
制約事項: テーブルを作成した後にプライマリ・キーにカラムを追加することはできません。
DROP column | ( column_list )
1つ以上のカラムを削除します。行に含まれている値も削除され、復元することはできません。複数のカラムを削除するには、カラムを丸かっこ内に配置して、コンマ区切りリストを使用します。
RENAME column_name TO column_name
プライマリ・キーのカラムの名前を変更し、既存の値を保持します。
制約事項: マテリアライズド・ビュー・ベースのテーブル、またはセカンダリ・インデックスまたはDatastax Enterprise Searchインデックスを含むテーブルではサポートされていません。
table_properties
既存のテーブルのプロパティを変更できます。いくつかのプロパティは単一のオプションとして、値に設定されます。
option_name = value [ AND ... ]
たとえば、speculative_retry = '10ms'があります。文字列プロパティの値は単一引用符で囲みます。

その他のプロパティは、JSONマップを使用して設定されます。 option_name = { subproperty_name : value [ , ... ] }

詳細については、「table_options」を参照してください。

このセクションでは、cyclist_racesテーブルを使用します。

カラムの追加

カラムを追加するには、ADD命令を使用します。
ALTER TABLE cycling.cyclist_races 
  ADD manager UUID;
コレクション型のカラムを追加するには、以下のように記述します。
ALTER TABLE cycling.cyclist_races 
  ADD completed list<text>;

この操作では既存のデータは検証されません。

制約事項: ADD命令を使用して次のカラムを追加することはできません。
  • 既存のカラムと同じ名前のカラム
  • テーブルにクラスター化カラムがない場合の静的カラム。

カラムの削除

テーブルからカラムを除去するには、DROP命令を使用します。
ALTER TABLE cycling.cyclist_races 
  DROP manager;

DROPは、テーブル定義からカラムを削除します。削除されたカラムは、すぐにクエリーできなくなります。カラム・データは次回のコンパクション時に削除されます。削除したカラムの除去をコンパクションの前に強制的に実行するには、ALTER TABLEを使用してメタデータを更新してから、nodetool upgradesstablesを実行して削除を有効にします。

制約事項:
  • カラムを削除して再び追加しても、削除する前にカラムに書き込まれていた値は復元されません。
  • 削除したカラムにクライアントで生成されたタイムスタンプが含まれている場合、そのカラムを再び追加しないでください。書き込み時間機能で生成されたタイムスタンプを含むカラムは再び追加できます。

カラムの名前変更

race_timesテーブのカラムを削除するには:
ALTER TABLE cycling.race_times 
  RENAME race_date TO date;
制約事項: RENAMEには以下の制限事項が適用されます。
  • 変更できるのは、プライマリ・キーのクラスター化カラムの名前のみです。
  • パーティション・キーによってノード上のデータ格納場所が決定するため、パーティション・キーの名前は変更できません。別のパーティション名が必要な場合は、テーブルを再作成し、データを移行する必要があります。
    注: SSTableは不変であるため、RENAMEを使用する場合、多くの制限事項が存在します。ディスクのデータの状態を変更するには、すべてを書き込みなおす必要があります。
  • 名前を変更したカラムのインデックスを作成できます。
  • そのカラムに基づいてインデックスが作成されているカラムの名前は変更できません。
  • 静的なカラムの名前は変更できません。

テーブル・プロパティの変更

既存のテーブルのプロパティを変更するには、ALTER TABLEおよびWITHを使用します。以下の項目を指定できます。
たとえば、WITHを使用してcyclist_baseテーブルにコメントを追加するには、次のように指定します。
ALTER TABLE cycling.cyclist_base
WITH comment = 'basic cyclist information';

テキスト・プロパティ値は単一引用符で囲んでください。

圧縮とコンパクションの変更

commentsテーブルの圧縮またはコンパクションの設定を変更するには、プロパティ・マップを使用します。
ALTER TABLE cycling.comments 
WITH compression = { 
   'sstable_compression' : 'DeflateCompressor', 
   'chunk_length_kb' : 64 };

各キーの名前を単一引用符で囲みます。値が文字列の場合も同様に引用符で囲みます。

注意: 既存のデータを含むテーブルのコンパクション・ストラテジを変更する場合、新しいストラテジを使用して既存のすべてのSSTableが再度書き込まれます。この処理には数時間かかり、プロダクション・システムでは大きな問題となるおそれがあります。この中断を最小限に抑えるためのストラテジについては、「プロダクション・クラスターでコンパクション・ストラテジを変更する方法」および「コンパクション・ストラテジ変更の影響」を参照してください。

キャッシングの変更

commentsテーブルの行キャッシュに格納するパーティションごとの行数を10行に設定します。
ALTER TABLE cycling.comments 
   WITH caching = {
    'keys': 'NONE', 
    'rows_per_partition': 10 };

推測的リトライの変更

cyclist_baseテーブルで、推測的リトライを95パーセンタイルに変更します。
ALTER TABLE cycling.cyclist_base
WITH speculative_retry = '95percentile';
cyclist_baseテーブルで、推測的リトライに10ミリ秒を使用します。
ALTER TABLE cycling.cyclist_base
WITH speculative_retry = '10ms';

バックグラウンド・コンパクションの有効化と無効化

enabledプロパティをfalseプロパティに設定してバックグラウンド・コンパクションを無効にするには、次のように指定します。
ALTER TABLE cycling.comments 
WITH COMPACTION = {
   'class': 'SizeTieredCompactionStrategy', 
   'enabled': 'false' };
警告: バックグラウンド・コンパクションを無効にすると、ディスク領域が回復せず、ゾンビが伝搬する可能性があるため、悪影響が及ぶことがあります。コンパクションはI/Oを消費しますが、ほとんどの場合、コンパクションを有効にしておくことを推奨します。

拡張コンパクション・ログの取得

特定のノードでのコンパクション・アクティビティーに関する詳細な情報を専用のログ・ファイルで収集するには、log_allサブプロパティをtrueに設定します。

重要: 拡張コンパクション・ロギングは、どのノードのどのテーブルに対して有効にした場合も、クラスター内の全ノードの全テーブルで有効になります。

拡張コンパクションを有効にすると、データベースによってcompaction-%d.log%dは連続番号)という名前のファイルがhome/logsに作成されます。

コンパクション・ロギング・サービスでは、次の種類のコンパクション・イベントに関する詳細な情報がログに記録されます。
  • type:enable

    以前にフラッシュされたSSTableをリストします。

    {"type":"enable","keyspace":"test","table":"t","time":1470071098866,"strategies":
      [    {"strategyId":"0","type":"LeveledCompactionStrategy","tables":[],"repaired":true,"folders":
          ["/home/carl/oss/cassandra/bin/../data/data"]},
        {"strategyId":"1","type":"LeveledCompactionStrategy","tables":[],"repaired":false,"folders":
          ["/home/carl/oss/cassandra/bin/../data/data"]
        }
     ]
    }
  • type: flush

    各テーブルのCompactionStrategyも含め、memtableのフラッシュ・イベントをディスク上のSSTableのログに記録します。

    {"type":"flush","keyspace":"test","table":"t","time":1470083335639,"tables":
      [    {"strategyId":"1","table":
          {"generation":1,"version":"mb","size":106846362,"details":
            {"level":0,"min_token":"-9221834874718566760","max_token":"9221396997139245178"}
          }
        }
     ]
    }
  • type: compaction

    コンパクション・イベントをログに記録します。

    {"type":"compaction","keyspace":"test","table":"t","time":1470083660267,
     "start":"1470083660188","end":"1470083660267","input":
      [    {"strategyId":"1","table":
          {"generation":1372,"version":"mb","size":1064979,"details":
            {"level":1,"min_token":"7199305267944662291","max_token":"7323434447996777057"}
          }
        }
     ],"output":
      [    {"strategyId":"1","table":
          {"generation":1404,"version":"mb","size":1064306,"details":
            {"level":2,"min_token":"7199305267944662291","max_token":"7323434447996777057"}
          }
        }
     ]
    }
  • type: pending

    コンパクション・ストラテジの保留中タスクの数をリストします。

    {"type":"pending","keyspace":"test","table":"t",
     "time":1470083447967,"strategyId":"1","pending":200}

テーブル定義の確認

DESCRIBEまたはDESCを使用してテーブル定義を表示します。
DESC cycling.comments
カラム名を含むテーブルの詳細が表示されます。
CREATE TABLE cycling.comments (
    id uuid,
    created_at timestamp,
    comment text,
    commenter text,
    record_id timeuuid,
    solr_query text,
    PRIMARY KEY (id, created_at)
) WITH CLUSTERING ORDER BY (created_at DESC)
    AND bloom_filter_fp_chance = 0.01
    AND caching = {'keys': 'NONE', 'rows_per_partition': '10'}
    AND comment = ''
    AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}
    AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.DeflateCompressor'}
    AND crc_check_chance = 1.0
    AND default_time_to_live = 0
    AND gc_grace_seconds = 864000
    AND max_index_interval = 2048
    AND memtable_flush_period_in_ms = 0
    AND min_index_interval = 128
    AND speculative_retry = '99PERCENTILE';