カラム操作
テーブルの構造を変更するためのクエリの集合。
構文:
クエリでは、1つ以上のアクションをカンマ区切りのリストとして指定します。 各アクションは列に対する操作です。
サポートされているアクションは次のとおりです。
- ADD COLUMN — テーブルに新しい列を追加します。
- DROP COLUMN — 列を削除します。
- RENAME COLUMN — 既存の列名を変更します。
- CLEAR COLUMN — 列の値をリセットします。
- COMMENT COLUMN — 列にテキストコメントを追加します。
- MODIFY COLUMN — 列の型、デフォルト式、TTL、および列設定を変更します。
- MODIFY COLUMN REMOVE — 列プロパティのいずれかを削除します。
- MODIFY COLUMN MODIFY SETTING — 列設定を変更します。
- MODIFY COLUMN RESET SETTING — 列設定をリセットします。
- MATERIALIZE COLUMN — 列が存在しないパーツでその列をマテリアライズします。
これらのアクションについては、以下で詳しく説明します。
ADD COLUMN(列を追加)
指定された name、type、codec、および default_expr(デフォルト式 セクションを参照)を持つ新しい列をテーブルに追加します。
IF NOT EXISTS 句を含めると、列がすでに存在している場合でもクエリはエラーを返しません。AFTER name_after(別の列の名前)を指定すると、その列の直後に列がテーブル列リスト内で追加されます。テーブルの先頭に列を追加したい場合は FIRST 句を使用します。そうでない場合、列はテーブルの末尾に追加されます。一連の操作として複数のアクションを実行する場合、name_after には、前のアクションのいずれかで追加された列名を指定できます。
列を追加しても、テーブル構造だけが変更され、データに対してはいかなる操作も行われません。ALTER の直後にはデータはディスク上に保存されません。テーブルから読み取る際に列のデータが存在しない場合、それはデフォルト値で補完されます(デフォルト式があればそれを評価し、なければゼロまたは空文字列を使用します)。列は、データパーツがマージされた後にディスク上に現れます(MergeTree を参照)。
このアプローチにより、既存データの容量を増やすことなく、ALTER クエリを即座に完了できます。
例:
DROP COLUMN
name という名前の列を削除します。IF EXISTS 句が指定されている場合、その列が存在しなくてもクエリはエラーを返しません。
ファイルシステムからデータを削除します。これはファイル全体を削除するため、クエリはほぼ瞬時に完了します。
マテリアライズドビュー で参照されている列は削除できません。削除しようとするとエラーが返されます。
例:
列名を変更する
カラム name を new_name にリネームします。IF EXISTS 句が指定されている場合、そのカラムが存在しなくてもクエリはエラーになりません。リネームは実データを変更しないため、クエリはほぼ即時に完了します。
注意: テーブルのキー式(ORDER BY または PRIMARY KEY)で指定されているカラムはリネームできません。これらのカラムを変更しようとすると、SQL Error [524] が発生します。
例:
CLEAR COLUMN
指定したパーティションのその列にあるすべてのデータをリセットします。パーティション名の設定方法については、パーティション式の設定方法 セクションを参照してください。
IF EXISTS 句が指定されている場合、その列が存在しなくてもクエリはエラーを返しません。
例:
COMMENT 列
カラムにコメントを追加します。IF EXISTS 句が指定されている場合、カラムが存在しない場合でもクエリはエラーを返しません。
各カラムには 1 つだけコメントを設定できます。すでにコメントが存在する場合は、新しいコメントが既存のコメントを上書きします。
コメントは、DESCRIBE TABLE クエリで返される comment_expression カラムに保存されます。
例:
MODIFY COLUMN
このクエリは name 列のプロパティを変更します:
-
型
-
デフォルト式
-
圧縮コーデック
-
TTL
-
列レベルの設定
列の圧縮コーデックの変更例については、Column Compression Codecs を参照してください。
列の TTL の変更例については、Column TTL を参照してください。
列レベルの設定の変更例については、Column-level Settings を参照してください。
IF EXISTS 句が指定されている場合、列が存在しなくてもクエリはエラーになりません。
型を変更する際、値はそれらに toType 関数が適用されたかのように変換されます。デフォルト式だけを変更する場合、このクエリは複雑な処理を行わず、ほぼ即時に完了します。
例:
カラム型の変更のみが複雑な操作になります。これはデータを含むファイルの内容を変更します。大きなテーブルでは、この処理に長い時間がかかる場合があります。
このクエリは、FIRST | AFTER 句を使用してカラムの順序を変更することもできます。詳細は ADD COLUMN の説明を参照してください。ただし、この場合はカラム型の指定が必須です。
例:
ALTER クエリはアトミックです。MergeTree テーブルの場合はロックフリーでもあります。
カラムを変更するための ALTER クエリはレプリケートされます。命令は ZooKeeper に保存され、その後各レプリカがそれを適用します。すべての ALTER クエリは同じ順序で実行されます。クエリは、他のレプリカ上で対応する処理が完了するのを待機します。ただし、レプリケートされたテーブルのカラムを変更するクエリは中断される可能性があり、その場合はすべての処理が非同期に実行されます。
Nullable カラムを Non-Nullable に変更する際は注意してください。カラム内に NULL 値が含まれていないことを必ず確認してください。そうでない場合、そのカラムから読み込む際に問題が発生します。その場合の回避策としては、KILL MUTATION を実行して mutation を停止し、カラムを Nullable 型に戻してください。
MODIFY COLUMN REMOVE
次の列プロパティのいずれかを削除します: DEFAULT, ALIAS, MATERIALIZED, CODEC, COMMENT, TTL, SETTINGS。
構文:
例
TTL を削除する:
関連項目
MODIFY COLUMN MODIFY SETTING — 列設定の変更
列の設定を変更します。
構文:
例
列の max_compress_block_size を 1MB に変更します。
MODIFY COLUMN RESET SETTING
列の設定をリセットします。また、テーブルの CREATE クエリ内の列式から、その設定の宣言も削除します。
構文:
例
カラム設定 max_compress_block_size をデフォルト値にリセットする:
MATERIALIZE COLUMN
DEFAULT または MATERIALIZED の値式を持つカラムをマテリアライズします。ALTER TABLE table_name ADD COLUMN column_name MATERIALIZED を使用してマテリアライズされたカラムを追加する場合、マテリアライズされた値を持たない既存の行は自動的には埋められません。MATERIALIZE COLUMN 文は、DEFAULT または MATERIALIZED の式が追加または更新された後(この操作はメタデータのみを更新し、既存データは変更しない)、既存のカラムデータを書き換えるために使用できます。ソートキー内のカラムをマテリアライズすることは、ソート順を破壊しうるため無効な操作である点に注意してください。
mutation として実装されています。
新規または更新された MATERIALIZED 値式を持つカラムについては、すべての既存の行が書き換えられます。
新規または更新された DEFAULT 値式を持つカラムについては、その動作は ClickHouse のバージョンに依存します。
- ClickHouse < v24.2 では、すべての既存の行が書き換えられます。
- ClickHouse >= v24.2 では、
DEFAULT値式を持つカラムの行の値が挿入時に明示的に指定されたか、DEFAULT値式から計算されたかを区別します。値が明示的に指定されていた場合、ClickHouse はそのまま保持します。値が計算されていた場合、ClickHouse はそれを新規または更新されたMATERIALIZED値式に基づく値に変更します。
構文:
- PARTITION を指定した場合、列は指定したパーティションに対してのみマテリアライズされます。
例
関連項目
制限事項
ALTER クエリでは、ネストされたデータ構造内の個々の要素(カラム)の作成および削除はできますが、ネストされたデータ構造全体の作成や削除はできません。ネストされたデータ構造を追加するには、name.nested_name のような名前と型 Array(T) を持つカラムを追加します。ネストされたデータ構造は、「ドットの前のプレフィックスが同じ名前」を持つ複数の配列カラムと同等です。
プライマリキーまたはサンプリングキー(ENGINE 式で使用されるカラム)に含まれるカラムの削除はサポートされていません。プライマリキーに含まれているカラムの型変更は、その変更によってデータが変更されない場合にのみ可能です(たとえば、Enum に値を追加する、または型を DateTime から UInt32 に変更することは許可されています)。
必要なテーブル変更を ALTER クエリだけで実現できない場合は、新しいテーブルを作成し、INSERT SELECT クエリを使用してデータをコピーし、その後 RENAME クエリを使用してテーブルを切り替え、古いテーブルを削除できます。
ALTER クエリは、そのテーブルに対するすべての読み書きをブロックします。言い換えると、ALTER クエリの実行時に長時間実行される SELECT がある場合、ALTER クエリはそれが完了するまで待機します。同時に、同じテーブルに対する新しいクエリも、この ALTER が実行中の間は待機します。
自分自身ではデータを保持しないテーブル(Merge や Distributed など)の場合、ALTER はテーブル構造のみを変更し、従属テーブルの構造は変更しません。たとえば、Distributed テーブルに対して ALTER を実行する場合、すべてのリモートサーバー上のテーブルに対しても ALTER を実行する必要があります。