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

INSERT INTO ステートメント

テーブルにデータを挿入します。

構文

挿入するカラムのリストを (c1, c2, c3) を使用して指定できます。また、*APPLYEXCEPTREPLACE などのカラム マッチャーモディファイア を使用することもできます。

例えば、次のテーブルを考えてみましょう:

すべてのカラムにデータを挿入したいが、カラム b を除外したい場合は、EXCEPT キーワードを使用できます。上記の構文に基づいて、指定されたカラム (c1, c3) に対して同じ数の値 (VALUES (v11, v13)) を挿入する必要があります:

この例では、2番目に挿入した行の ac カラムは渡された値で埋められ、b カラムはデフォルト値で埋められていることがわかります。また、DEFAULT キーワードを使用してデフォルト値を挿入することも可能です:

カラムのリストにすべての既存のカラムが含まれていない場合、残りのカラムは以下で埋められます:

  • テーブル定義に指定された DEFAULT 式から計算された値。
  • DEFAULT 式が定義されていない場合はゼロと空の文字列。

データは ClickHouse がサポートする任意の フォーマットINSERT に渡すことができます。フォーマットはクエリ内で明示的に指定する必要があります:

例えば、次のクエリフォーマットは基本版の INSERT ... VALUES と同じです:

ClickHouse はデータの前にすべての空白と1行の改行(もしあれば)を削除します。クエリを形成する際には、データがクエリ演算子の後に新しい行に配置されることをお勧めします。データが空白で始まる場合は特に重要です。

例:

コマンドラインクライアント または HTTPインターフェース を使用して、クエリからデータを別々に挿入することもできます。

注記

INSERT クエリに SETTINGS を指定したい場合は、FORMAT クローズの前に行う必要があります。なぜなら、FORMAT format_name の後のすべてはデータとして扱われるからです。例えば:

制約

テーブルに 制約 がある場合、それらの式は挿入されたデータの各行に対してチェックされます。いずれかの制約が満たされない場合、サーバーは制約名と式を含む例外を発生させ、クエリは停止します。

SELECT の結果を挿入する

構文

カラムは SELECT クローズ内の位置に応じてマッピングされます。ただし、INSERT のテーブル内の SELECT 式のカラム名は異なる場合があります。必要に応じて型キャストが行われます。

値を now()1 + 2 などの式に設定することは、Values フォーマットを除くデータフォーマットでは許可されていません。Values フォーマットは限られた式の使用を許可していますが、これはお勧めしません。この場合、非効率的なコードが実行されます。

データパーツを変更する他のクエリはサポートされていません:UPDATEDELETEREPLACEMERGEUPSERTINSERT UPDATE。しかし、ALTER TABLE ... DROP PARTITION を使用して古いデータを削除することができます。

SELECT クローズにテーブル関数 input() が含まれる場合、FORMAT クローズはクエリの最後に指定する必要があります。

非NULLデータ型のカラムに NULL の代わりにデフォルト値を挿入するには、insert_null_as_default 設定を有効にします。

INSERT は CTE(共通テーブル式)もサポートしています。例えば、次の2つのステートメントは同等です:

ファイルからデータを挿入する

構文

上記の構文を使用して、クライアント側に保存されたファイル、またはファイルからデータを挿入します。file_nametype は文字列リテラルです。入力ファイルの フォーマット は、FORMAT クローズで設定する必要があります。

圧縮ファイルがサポートされています。圧縮タイプはファイル名の拡張子によって検出されます。または、COMPRESSION クローズで明示的に指定することもできます。サポートされているタイプは: 'none''gzip''deflate''br''xz''zstd''lz4''bz2' です。

この機能は コマンドラインクライアントclickhouse-local で利用可能です。

FROM INFILE 付きの単一ファイル

次のクエリを コマンドラインクライアント を使用して実行します:

結果:

glob を使用して FROM INFILE から複数ファイルを挿入する

この例は前の例に非常に似ていますが、FROM INFILE 'input_*.csv' を使用して複数のファイルから挿入を行います。

ヒント

* を使用して複数のファイルを選択することに加えて、範囲({1,2} または {1..9})や他の glob 置換 を使用することができます。これらの3つはすべて、上記の例で機能します:

テーブル関数を使用して挿入する

データは テーブル関数 で参照されるテーブルに挿入できます。

構文

次のクエリでは remote テーブル関数が使用されます:

結果:

ClickHouse Cloud への挿入

デフォルトでは、ClickHouse Cloud 上のサービスは高可用性のために複数のレプリカを提供します。サービスに接続すると、これらのレプリカのいずれかに接続が確立されます。

INSERT が成功すると、データが基盤となるストレージに書き込まれます。ただし、レプリカがこれらの更新を受け取るまでに時間がかかる場合があります。したがって、これらの他のレプリカのいずれかで SELECT クエリを実行する別の接続を使用した場合、更新されたデータがまだ反映されていない可能性があります。

select_sequential_consistency を使用して、レプリカに最新の更新を強制的に受信させることができます。次のように設定を使用した SELECT クエリの例を示します:

select_sequential_consistency を使用すると、ClickHouse Cloud 内部で使用される ClickHouse Keeper の負荷が増加し、サービスの負荷に応じてパフォーマンスが低下する可能性があることに注意してください。この設定を有効にすることは、必要でない限りお勧めしません。推奨のアプローチは、同じセッション内で読み書きを実行するか、ネイティブプロトコルを使用するクライアントドライバを使用することです(つまり、ステッキー接続をサポートしています)。

レプリケーションされたセットアップへの挿入

レプリケーションされたセットアップでは、データがレプリケートされた後、他のレプリカでも表示されます。INSERT 直後からデータのレプリケーション(他のレプリカにダウンロード)が始まります。これは、データが共有ストレージに即座に書き込まれ、レプリカがメタデータの変更を購読する ClickHouse Cloud とは異なります。

レプリケーションされたセットアップでは、INSERT が時折かなりの時間(約1秒)かかることがあることに注意してください。これは、分散コンセンサスのために ClickHouse Keeper にコミットする必要があるためです。ストレージに S3 を使用する場合は、追加のレイテンシが加わります。

パフォーマンスに関する考慮事項

INSERT は入力データを主キーでソートし、パーティションキーでパーティションに分割します。同時にいくつかのパーティションにデータを挿入すると、INSERT クエリのパフォーマンスが大幅に低下する可能性があります。これを回避するためには:

  • 比較的大きなバッチでデータを追加します。例えば、100,000行ずつ。
  • ClickHouse にアップロードする前にパーティションキーでデータをグループ化します。

リアルタイムでデータが追加される場合や、通常は時間でソートされたデータをアップロードする場合は、パフォーマンスが低下しません。

非同期挿入

小さくても頻繁にデータを非同期に挿入することが可能です。このような挿入からのデータはバッチにまとめられ、安全にテーブルに挿入されます。非同期挿入を使用するには、async_insert 設定を有効にします。

async_insert または Buffer テーブルエンジン を使用すると、追加のバッファリングが発生します。

大規模または長時間にわたる挿入

大量のデータを挿入しているとき、ClickHouse は「スカッシング」と呼ばれるプロセスを通じて書き込みパフォーマンスを最適化します。メモリ内に挿入された小さなデータブロックはマージされ、大きなブロックにスカッシュされてディスクに書き込まれます。スカッシングは、各書き込み操作に関連するオーバーヘッドを削減します。このプロセスでは、挿入されたデータは ClickHouse が max_insert_block_size 行の書き込みを完了した後にクエリ可能になります。

関連項目