カラム操作
テーブル構造を変更するためのクエリセット。
構文:
クエリ内で、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_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
値式を持つカラムの行値が挿入時に明示的に指定されたかどうかを区別します。値が明示的に指定されていた場合、ClickHouse はそのまま保持します。値が計算された場合、ClickHouse はそれを新しいまたは更新されたMATERIALIZED
値式に変更します。
構文:
- PARTITION を指定すると、指定されたパーティションのみでカラムがマテリアライズされます。
例
関連項目
制限事項
ALTER
クエリは、ネストされたデータ構造内の別々の要素(カラム)を作成および削除できますが、全体のネストされたデータ構造を削除することはできません。ネストされたデータ構造を追加するには、name.nested_name
のような名前のカラムを追加し、Array(T)
の型を指定します。ネストされたデータ構造は、ドットの前に同じプレフィックスを持つ複数の配列カラムに相当します。
プライマリキーやサンプリングキーに含まれるカラムの削除はサポートされていません(ENGINE
式で使用されるカラム)。プライマリキーに含まれるカラムの型を変更することは、データが変更される原因とならない場合のみ可能です(たとえば、Enum に値を追加することや、DateTime
から UInt32
へ型を変更することは許可されています)。
ALTER
クエリだけでは必要なテーブル変更が不十分な場合、新しいテーブルを作成し、INSERT SELECT クエリを使用してデータをコピーし、その後 RENAME クエリを使用してテーブルを切り替え、古いテーブルを削除することができます。
ALTER
クエリは、テーブルのすべての読み取りおよび書き込みをブロックします。言い換えれば、長時間の SELECT
が ALTER
クエリの実行中に実行されている場合、ALTER
クエリはそれが完了するのを待ちます。同時に、同じテーブルへの新しいすべてのクエリは、この ALTER
が実行されている間待機します。
データを自分自身で保存しないテーブル(Merge や Distributed など)の場合、ALTER
はテーブル構造を変更するだけで、従属テーブルの構造は変更しません。たとえば、Distributed
テーブルに対して ALTER
を実行すると、すべてのリモートサーバー上のテーブルに対しても ALTER
を実行する必要があります。