メインコンテンツまでスキップ
メインコンテンツまでスキップ

カラム操作

テーブル構造を変更するためのクエリセット。

構文:

クエリ内で、1つ以上のカンマ区切りのアクションのリストを指定します。各アクションはカラムに対する操作です。

次のアクションがサポートされています:

  • ADD COLUMN — テーブルに新しいカラムを追加します。
  • DROP COLUMN — カラムを削除します。
  • RENAME COLUMN — 既存のカラムの名前を変更します。
  • CLEAR COLUMN — カラムの値をリセットします。
  • COMMENT COLUMN — カラムにテキストコメントを追加します。
  • MODIFY COLUMN — カラムの型、デフォルト式、TTL、およびカラム設定を変更します。
  • MODIFY COLUMN REMOVE — カラムプロパティの1つを削除します。
  • MODIFY COLUMN MODIFY SETTING - カラム設定を変更します。
  • MODIFY COLUMN RESET SETTING - カラム設定をリセットします。
  • MATERIALIZE COLUMN — カラムが欠落しているパーツにカラムをマテリアライズします。 これらのアクションは、以下で詳しく説明します。

ADD COLUMN

指定された name, type, codec および default_expr を持つ新しいカラムをテーブルに追加します(デフォルト式のセクションを参照してください Default expressions)。

IF NOT EXISTS 句が含まれている場合、カラムが既に存在する場合はエラーは返されません。AFTER name_after (別のカラムの名前)を指定すると、そのカラムの後に追加されます。テーブルの最初にカラムを追加したい場合は FIRST 句を使用します。そうでない場合、カラムはテーブルの最後に追加されます。アクションのチェーンの場合、name_after は以前のアクションで追加されたカラムの名前であることができます。

カラムを追加することはテーブルの構造を変更するだけで、データには何の操作も行いません。ALTER の後、データはディスクには表示されません。テーブルからの読み取り時にカラムのデータが欠落している場合、デフォルト値で埋められます(デフォルト式があればそれを実行し、なければゼロまたは空文字列を使用します)。カラムはデータパーツがマージされた後にディスクに表示されます(MergeTreeを参照)。

このアプローチにより、古いデータのボリュームを増やすことなく、ALTER クエリを瞬時に完了できます。

例:

DROP COLUMN

name という名前のカラムを削除します。IF EXISTS 句が指定されている場合、カラムが存在しない場合はエラーは返されません。

ファイルシステムからデータを削除します。この操作は、ファイル全体を削除するため、クエリはほとんど瞬時に完了します。

ヒント

Materialized viewによって参照されているカラムは削除できません。それ以外の場合はエラーが返されます。

例:

RENAME COLUMN

カラム name の名前を new_name に変更します。IF EXISTS 句が指定されている場合、カラムが存在しない場合はエラーは返されません。名前変更には基になるデータが含まれないため、クエリはほとんど瞬時に完了します。

注意: テーブルのキー式(ORDER BY または PRIMARY KEY で指定)のカラムは名前変更できません。これらのカラムを変更しようとすると SQL Error [524] が発生します。

例:

CLEAR COLUMN

指定されたパーティションのカラム内の全データをリセットします。パーティション名の設定方法については、How to set the partition expression セクションを参照してください。

IF EXISTS 句が指定されている場合、カラムが存在しない場合はエラーは返されません。

例:

COMMENT COLUMN

カラムにコメントを追加します。IF EXISTS 句が指定されている場合、カラムが存在しない場合はエラーは返されません。

各カラムには1つのコメントを持つことができます。カラムに既にコメントが存在する場合、新しいコメントは前のコメントを上書きします。

コメントは、DESCRIBE TABLE クエリによって返される comment_expression カラムに保存されます。

例:

MODIFY COLUMN

このクエリは name カラムのプロパティを変更します:

  • デフォルト式
  • 圧縮コーデック
  • TTL
  • カラム設定

カラム圧縮 CODECS の例については、Column Compression Codecs を参照してください。

カラムの TTL の変更例については、Column TTLを参照してください。

カラム設定の変更例については、Column-level Settingsを参照してください。

IF EXISTS 句が指定されている場合、カラムが存在しない場合はエラーは返されません。

型を変更すると、値はあたかも toType 関数が適用されたかのように変換されます。デフォルト式のみが変更された場合、クエリは複雑な処理を行わず、ほとんど瞬時に完了します。

例:

カラムの型を変更することは唯一の複雑なアクションです – これはデータのファイルの内容を変更します。大規模なテーブルでは、これには長い時間がかかる場合があります。

クエリはまた、FIRST | AFTER 句を使用してカラムの順序を変更できます。ADD COLUMN の説明を参照してください。ただし、カラムの型はこの場合必須です。

例:

ALTER クエリは原子的です。MergeTree テーブルの場合、ロックなしで実行されます。

カラムを変更するための ALTER クエリはレプリケートされます。指示は ZooKeeper に保存され、各レプリカがそれを適用します。すべての ALTER クエリは同じ順序で実行されます。クエリは、他のレプリカで適切なアクションが完了するのを待ちます。ただし、レプリケートテーブルのカラムを変更するクエリは中断でき、すべてのアクションは非同期に実行されます。

MODIFY COLUMN REMOVE

カラムプロパティの1つを削除します:DEFAULT, ALIAS, MATERIALIZED, CODEC, COMMENT, TTL, SETTINGS

構文:

TTLを削除:

関連項目

MODIFY COLUMN MODIFY SETTING

カラム設定を変更します。

構文:

カラムの max_compress_block_size1MB に変更:

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 値式を持つカラムの行値が挿入時に明示的に指定されたかどうかを区別します。値が明示的に指定されていた場合、ClickHouse はそのまま保持します。値が計算された場合、ClickHouse はそれを新しいまたは更新された MATERIALIZED 値式に変更します。

構文:

  • PARTITION を指定すると、指定されたパーティションのみでカラムがマテリアライズされます。

関連項目

制限事項

ALTER クエリは、ネストされたデータ構造内の別々の要素(カラム)を作成および削除できますが、全体のネストされたデータ構造を削除することはできません。ネストされたデータ構造を追加するには、name.nested_name のような名前のカラムを追加し、Array(T) の型を指定します。ネストされたデータ構造は、ドットの前に同じプレフィックスを持つ複数の配列カラムに相当します。

プライマリキーやサンプリングキーに含まれるカラムの削除はサポートされていません(ENGINE 式で使用されるカラム)。プライマリキーに含まれるカラムの型を変更することは、データが変更される原因とならない場合のみ可能です(たとえば、Enum に値を追加することや、DateTime から UInt32 へ型を変更することは許可されています)。

ALTER クエリだけでは必要なテーブル変更が不十分な場合、新しいテーブルを作成し、INSERT SELECT クエリを使用してデータをコピーし、その後 RENAME クエリを使用してテーブルを切り替え、古いテーブルを削除することができます。

ALTER クエリは、テーブルのすべての読み取りおよび書き込みをブロックします。言い換えれば、長時間の SELECTALTER クエリの実行中に実行されている場合、ALTER クエリはそれが完了するのを待ちます。同時に、同じテーブルへの新しいすべてのクエリは、この ALTER が実行されている間待機します。

データを自分自身で保存しないテーブル(MergeDistributed など)の場合、ALTER はテーブル構造を変更するだけで、従属テーブルの構造は変更しません。たとえば、Distributed テーブルに対して ALTER を実行すると、すべてのリモートサーバー上のテーブルに対しても ALTER を実行する必要があります。