すべてのプロダクト
Search
ドキュメントセンター

E-MapReduce:INSERT INTO

最終更新日:Jan 11, 2025

StarRocks での INSERT INTO ステートメントの使い方は、MySQL やその他のデータベースと似ています。ただし、StarRocks では、すべてのデータ書き込みは独立したインポートジョブを使用して実行されます。したがって、INSERT INTO は StarRocks ではインポートメソッドとして記述されます。このトピックでは、INSERT INTO インポートメソッドのシナリオ、構成、および例について説明します。

シナリオ

  • INSERT INTO ステートメントを実行してデータをインポートすると、結果は同期的に返されます。
  • StarRocks システムをテストするために少数のデータ行をインポートする場合、INSERT INTO VALUES ステートメントを実行できます。
  • StarRocks テーブルのデータに対して抽出、変換、ロード (ETL) 操作を実行し、そのデータを別の StarRocks テーブルにインポートする場合、INSERT INTO SELECT ステートメントを実行できます。
  • 外部テーブルを作成できます。たとえば、MySQL テーブルのデータをマッピングする MySQL 外部テーブルを作成します。その後、INSERT INTO SELECT ステートメントを実行して、外部テーブルのデータを StarRocks テーブルにインポートできます。

注意事項

  • デフォルトでは、INSERT INTO ステートメントを実行すると、宛先テーブルの形式要件に準拠していないデータは除外されます。たとえば、指定された長さを超える文字列は除外されます。データを除外できないビジネスシナリオでは、enable_insert_strict セッション変数を true に設定して、データが除外された場合に INSERT INTO ステートメントが実行されないようにすることができます。
  • StarRocks では、INSERT INTO ステートメントはインポートデータロジックを再利用します。その結果、INSERT INTO ステートメントを実行するたびに新しいデータバージョンが生成されます。少量のデータをインポートする操作を頻繁に実行すると、過剰なデータバージョンが生成されます。これはクエリのパフォーマンスに影響します。実稼働環境では、INSERT INTO ステートメントを頻繁に実行してデータをインポートしたり、ルーチンインポートジョブとして使用したりしないことをお勧めします。ストリームデータまたは小バッチのデータをインポートする必要がある場合は、ストリームロード または ルーチンロード メソッドを使用できます。

基本操作

構文

INSERT INTO table_name
[ PARTITION (p1, ...) ]
[ WITH LABEL label]
[ (column [, ...]) ]
[ [ hint [, ...] ] ]
{ VALUES ( { expression | DEFAULT } [, ...] ) [, ...] | query }
次の表にパラメーターを示します。
パラメーター説明
table_nameデータをインポートする宛先テーブルの名前。db_name.table_name 形式でテーブル名を入力します。
partitionsデータをインポートするパーティションを指定します。指定するパーティションは、table_name テーブルに存在する必要があります。複数のパーティション名はコンマ (,) で区切ります。パーティションを指定すると、パーティションの要件を満たすデータのみがインポートされます。このパラメーターを空のままにすると、デフォルト値は table_name テーブルのすべてのパーティションの名前になります。
labelインポートジョブのラベルを指定します。ラベルは、INSERT INTO ジョブを識別するために使用されます。各インポートジョブは、単一のデータベース内で一意のラベルを持ちます。
重要 システムによって自動的に割り当てられるラベルを使用する代わりに、インポートジョブのラベルを指定することをお勧めします。システムによって割り当てられたラベルを使用する場合、ネットワークエラーによって接続が閉じられたときに INSERT INTO ステートメントの実行結果を知ることはできません。インポートジョブのラベルを指定すると、ラベルを使用して INSERT INTO ステートメントの実行結果をクエリできます。
column_name宛先列を指定します。列は table_name テーブルに存在する必要があります。

ソーステーブルからデータをインポートする宛先列。列は任意の順序で存在できます。デフォルトでは、このパラメーターを空のままにすると、table_name テーブルのすべての列が宛先列になります。ソーステーブルの列が宛先列に存在しない場合、その列にはデフォルト値が必要です。そうでない場合、INSERT INTO ステートメントは実行に失敗します。クエリステートメントによって返される列の型が宛先列の型と異なる場合、暗黙的な変換が実行されます。変換に失敗すると、INSERT INTO ステートメントは構文解析エラーを返します。

expression列に値を割り当てる式。
default列にデフォルト値を割り当てます。
query結果が宛先テーブルに書き込まれる一般的なクエリステートメント。StarRocks でサポートされているすべての SQL ステートメントを使用できます。
valuesINSERT INTO VALUES ステートメントを実行することで、1 つ以上のデータ行を書き込むことができます。
重要 INSERT INTO VALUES ステートメントを実行して、いくつかのデータ行を使用してデモを確認できます。このステートメントは、テスト環境または実稼働環境には適用できません。StarRocks は、単一のデータ行のみがインポートされるシナリオには適していません。INSERT INTO SELECT ステートメントを実行して複数のデータ行をインポートすることをお勧めします。

インポート結果

INSERT INTO ステートメント(これも SQL ステートメントです)のサンプル戻り結果を以下に示します。
  • 正常に実行された場合のサンプル結果
    • 例 1
      insert into tbl1 select * from empty_tbl; ステートメントを実行します。次の結果が返されます。
      Query OK, 0 rows affected (0.02 sec)
    • 例 2
      insert into tbl1 select * from tbl2; ステートメントを実行します。次の結果が返されます。
      Query OK, 4 rows affected (0.38 sec)
      {'label':'insert_8510c568-9eda-4173-9e36-6adc7d35291c', 'status':'visible', 'txnId':'4005'}
    • 例 3
      insert into tbl1 with label my_label1 select * from tbl2; ステートメントを実行します。次の結果が返されます。
      Query OK, 4 rows affected (0.38 sec)
      {'label':'my_label1', 'status':'visible', 'txnId':'4005'}
    • 例 4
      insert into tbl1 select * from tbl2; ステートメントを実行します。次の結果が返されます。
      Query OK, 2 rows affected, 2 warnings (0.31 sec)
      {'label':'insert_f0747f0e-7a35-46e2-affa-13a235f4020d', 'status':'visible', 'txnId':'4005'}
      次の結果が返される場合もあります。
      Query OK, 2 rows affected, 2 warnings (0.31 sec)
      {'label':'insert_f0747f0e-7a35-46e2-affa-13a235f4020d', 'status':'committed', 'txnId':'4005'}
    戻り結果に含まれるパラメーターを次の表に示します。
    パラメーター説明
    rows affectedインポートされたデータ行の総数を示します。
    warnings除外されたデータ行の数を示します。
    statusインポートされたデータが表示されるかどうかを示します。有効な値:
    • visible:インポートされたデータが表示されます。
    • committed:インポートされたデータは表示されません。
    txnIdINSERT トランザクションの ID。
    err予期しないエラーを示します。除外されたデータ行を表示する必要がある場合は、SHOW LOAD ステートメントを実行できます。戻り結果の URL を使用して、エラーデータをクエリできます。
  • 失敗した場合のサンプル結果

    実行に失敗した場合、データはインポートされません。

    たとえば、insert into tbl1 select * from tbl2 where k1 = "a"; ステートメントを実行します。次の結果が返されます。
    ERROR 1064 (HY000): all partitions have no load data. url: [http://10.74.167.16:8042/api/_load_error_log?file=__shard_2/error_log_insert_stmt_ba8bb9e158e4879-ae8de8507c0bf8a2_ba8bb9e158e4879_ae8de8507c0bf8a2](http://10.74.**.**:8042/api/_load_error_log?file=__shard_2/error_log_insert_stmt_ba8bb9e158e4879-ae8de8507c0bf8a2_ba8bb9e158e4879_ae8de8507c0bf8a2)

    戻り結果の ERROR 1064 (HY000): all partitions have no load data エラーは、失敗の原因を示しています。URL を使用して、エラーデータをクエリできます。

関連パラメーター

FE ノードのパラメーター

timeout: インポートジョブのタイムアウト期間。単位:秒。指定されたタイムアウト期間内にインポートジョブが完了しない場合、システムはジョブをキャンセルします。この場合、ジョブは CANCELLED 状態になります。INSERT INTO ステートメントの実行は、カスタムタイムアウト期間をサポートしていません。INSERT INTO インポートメソッドを使用するすべてのインポートジョブのタイムアウト期間は同じです。デフォルトのタイムアウト期間は 1 時間です。インポートタスクが指定されたタイムアウト期間内に完了しない場合は、フロントエンド (FE) ノードの insert_load_default_timeout_second パラメーターの値を調整する必要があります。

セッションパラメーター

パラメーター説明
enable_insert_strictINSERT INTO インポートメソッドは、インポートジョブの許容可能な失敗率を制御できません。enable_insert_strict セッションパラメーターを設定して、インポートジョブの許容可能な失敗率を制御できます。有効な値:
  • true:1 つのデータ行でエラーが発生した場合にインポートジョブが失敗することを指定します。これはデフォルト値です。
  • false:少なくとも 1 つのデータ行がインポートされた場合に成功結果が返されることを指定します。インポートジョブが失敗した場合、ラベルが返されます。

    SET enable_insert_strict = false コマンドを実行することで、このパラメーターを false に設定できます。

query_timeoutINSERT INTO ステートメントも SQL ステートメントです。その結果、INSERT INTO ステートメントは query_timeout セッションパラメーターによって制限されます。SET query_timeout = xxx コマンドを実行することで、タイムアウト期間を増やすことができます。タイムアウト期間は秒単位で測定されます。

データベースとテーブルの作成

  1. 次のステートメントを実行してデータベースを作成します。
    CREATE DATABASE IF NOT EXISTS load_test;
  2. 次のステートメントを実行してデータベースを指定します。
    USE load_test;
  3. 次のステートメントを実行してテーブルを作成します。
    CREATE TABLE insert_wiki_edit
    (
        event_time DATETIME,
        channel VARCHAR(32) DEFAULT '',
        user VARCHAR(128) DEFAULT '',
        is_anonymous TINYINT DEFAULT '0',
        is_minor TINYINT DEFAULT '0',
        is_new TINYINT DEFAULT '0',
        is_robot TINYINT DEFAULT '0',
        is_unpatrolled TINYINT DEFAULT '0',
        delta INT SUM DEFAULT '0',
        added INT SUM DEFAULT '0',
        deleted INT SUM DEFAULT '0'
    )
    AGGREGATE KEY(event_time, channel, user, is_anonymous, is_minor, is_new, is_robot, is_unpatrolled)
    PARTITION BY RANGE(event_time)
    (
        PARTITION p06 VALUES LESS THAN ('2015-09-12 06:00:00'),
        PARTITION p12 VALUES LESS THAN ('2015-09-12 12:00:00'),
        PARTITION p18 VALUES LESS THAN ('2015-09-12 18:00:00'),
        PARTITION p24 VALUES LESS THAN ('2015-09-13 00:00:00')
    )
    DISTRIBUTED BY HASH(user) BUCKETS 10
    PROPERTIES("replication_num" = "1");

INSERT INTO VALUES ステートメントを実行してデータをインポートする

次のステートメントを実行してデータをインポートします。
INSERT INTO insert_wiki_edit VALUES("2015-09-12 00:00:00","#en.wikipedia","GELongstreet",0,0,0,0,0,36,36,0),("2015-09-12 00:00:00","#ca.wikipedia","PereBot",0,1,0,1,0,17,17,0);
次の情報が返されます。
Query OK, 2 rows affected (0.29 sec)
{'label':'insert_1f12c916-5ff8-4ba9-8452-6fc37fac2e75', 'status':'visible', 'txnId':'601'}

INSERT INTO SELECT ステートメントを実行してデータをインポートする

次のステートメントを実行してデータをインポートします。
INSERT INTO insert_wiki_edit WITH LABEL insert_load_wikipedia SELECT * FROM routine_wiki_edit;
次の情報が返されます。
Query OK, 18203 rows affected (0.40 sec)
{'label':'insert_load_wikipedia', 'status':'visible', 'txnId':'618'}