ALTER TABLE

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

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

制約事項: PRIMARY KEYカラムの変更はサポートされていません。マテリアライズド・ビューを含むテーブルのカラムの変更はサポートされていません。
注: ALTER COLUMNFAMILYは廃止予定です。

構文

ALTER TABLE [keyspace_name.]table_name 
[ALTER column_name TYPE cql_type]
[ADD (column_definition_list)]
[DROP (column_list)]
[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要素を上書きするための実体とリテラル値を示します。
ALTER column_name TYPE cql_type

column_name:変更するカラムの名前。

cql_type:カラムのデータ型を互換性のある型に変更します。

注: コレクション(リスト、セット、およびマップ)とカウンターの型の変更はサポートされていません。
CQLデータ型には、変換の互換性について厳密な要件があります。以下の表に、置き換え可能なデータ型を示します。
表 2. データ型の互換性
変換前の型 変換後の型
ascii、bigint、boolean、decimal、double、float、inet、int、timestamp、timeuuid、uuid、varchar、varint BLOB
int varint
text varchar
timeuuid uuid
varchar text
クラスター化カラムでは、データがディスクに書き込まれる順序が指定されているため、より厳密な要件があります。以下の表に、クラスター化カラムで使用されるデータ型について、置き換え可能なデータ型を示します。
表 3. クラスター化カラム型の互換性
変換前の型 変換後の型
varint int
varchar text
text varchar
ADD (column_definition_list)
1つ以上のカラムを追加してデータ型を設定し、名前、データ型の順に入力します。値は自動的にNullに設定されます。複数のカラムを追加するには、コンマ区切りリストを使用します。
column_name cql_type [,]
[column_name cql_type [, ...]
制約事項: テーブルを作成した後にPRIMARY KEYを追加することはできません。
DROP (column_list)
削除するカラムのコンマ区切りリスト。行に含まれている値も削除され、復元することはできません。
RENAME column_name TO column_name
カラムの名前を変更し、既存の値を保持します。
table_properties
テーブルを作成した後にプロパティを変更できます。プロパティには2つの種類があり、1つのオプションはvalueと等しい値に設定されます。
option_name = value [AND ...]
たとえば、speculative_retry = '10ms'があります。文字列プロパティの値は単一引用符で囲みます。

一部のテーブル・プロパティは、次の単純なJSON形式でマップとして定義されます。option_name = { subproperty_name : value [, ...]}

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

テーブルとキースペースの指定

テーブル名は、キースペースの名前を前に追加して修飾できます。たとえば、cyclingキースペース内のteamsテーブルを指定するには、以下のように記述します。

ALTER TABLE cycling.teams ALTER ID TYPE uuid;

カラムの型の変更

カラムのデータ型を互換性のある型に変更します。

birthdayタイムスタンプ・カラムをBLOB型に変更します。

ALTER TABLE cycling.cyclist_alt_stats 
ALTER birthday TYPE  blob;

カラムのデータ型を変更できるのは、カラムが既に存在する場合のみです。カラムのデータ型が変更されても、そのカラムの値に格納されているバイトは変更されません。既存のデータが新しいデータ型に従ってデシリアライズできない場合は、CQLドライバーまたはインターフェイスがエラーを報告します。

警告:

データを挿入した後でカラムの型を変更すると、新しい型が挿入したデータと互換性がない場合にCQLドライバー/ツールで混乱が生じることがあります。

カラムの追加

(コレクション型以外の)カラムをテーブルに追加するには、ADD命令を使用します。

ALTER TABLE cycling.cyclist_races 
ADD firstname text;

コレクション型のカラムを追加するには、以下のように記述します。

ALTER TABLE cycling.upcoming_calendar 
ADD events list<text>;

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

ADD命令を使用して次のカラムを追加することはできません。

  • 既存のカラムと同じ名前のカラム
  • テーブルにクラスター化カラムがなく、COMPACT STORAGEを使用する場合の静的カラム。

カラムの削除

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

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

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

カラムの名前変更

RENAMEの主な目的は、CQLで生成されたプライマリ・キーの名前と、レガシー・テーブルに見つからないカラム名を変更することです。RENAME操作には以下の制限事項が適用されます。
  • 変更できるのは、プライマリ・キーのクラスター化カラムの名前のみです。
  • パーティション・キーの名前は変更できません。
  • 名前を変更したカラムのインデックスを作成できます。
  • そのカラムに基づいてインデックスが作成されているカラムの名前は変更できません。
  • 静的カラムはテーブルのプライマリ・キーに使用できないため、静的カラムの名前は変更できません。

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

テーブルの作成時に設定したテーブル・ストレージ・プロパティを変更するには、以下のいずれかの形式を使用します。

この例では、WITH命令を使用して、非クォーラムの整合性の維持に使用するテーブルの読み取りリペアを構成するread_repair_chanceプロパティを変更し、ANDを使用して複数のプロパティを変更します。

ALTER TABLE cyclist_mv
  WITH comment = 'ID, name, birthdate and country'
     AND read_repair_chance = 0.2;

テキスト・プロパティ値は単一引用符で囲んでください。COMPACT STORAGEを使用するテーブルのプロパティは変更できません。

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

テーブルの圧縮またはコンパクションの設定を変更するには、プロパティ・マップを使用します。

ALTER TABLE cycling_comments 
WITH compression = { 
   'sstable_compression' : 'DeflateCompressor', 
   'chunk_length_kb' : 64 };

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

注意: 既存のデータを含むテーブルのコンパクション・ストラテジを変更する場合、新しいストラテジを使用して既存のすべてのSSTableが再度書き込まれます。この処理には数時間かかり、実稼働システムでは大きな問題となるおそれがあります。この中断を最小限に抑えるためのストラテジについては、「How to change the compaction strategy on a production cluster」および「Impact of Changing Compaction Strategy」を参照してください。

キャッシングの変更

10を返すクエリーを最適化するには、プロパティ・マップを使用してキャッシング・オプションを作成し、変更します。

ALTER TABLE cycling.events 
   WITH caching = {
    'keys': 'NONE', 
    'rows_per_partition': 10 };

テーブル定義の確認

DESCRIBEを使用してテーブル定義を表示します。
DESC TABLE cycling.events;

カラム名を含む詳細が表示されます。

CREATE TABLE cycling.events (
    month int,
    end timestamp,
    class text,
    title text,
    location text,
    start timestamp,
    type text,
    PRIMARY KEY (month, end, class, title)
) WITH CLUSTERING ORDER BY (end ASC, class ASC, title ASC)
    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.LZ4Compressor'}
    AND crc_check_chance = 1.0
    AND dclocal_read_repair_chance = 0.1
    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 read_repair_chance = 0.0
    AND speculative_retry = '99PERCENTILE';