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

MaxCompute:MULTI INSERT

最終更新日:Dec 06, 2024

MaxCompute SQLでは、MULTI insertステートメントを使用して、異なる宛先テーブルまたはパーティションに同時にデータを挿入できます。 MULTI INSERTステートメントを実行すると、複数のINSERT INTOまたはINSERT OVERWRITE操作が同時に実行されます。

次のプラットフォームでステートメントを実行できます。

前提条件

ターゲットテーブルに対するALTER権限と、ソーステーブルのメタデータに対するDESCRIBE権限があります。 権限を付与する方法の詳細については、「MaxCompute権限」をご参照ください。

説明

MaxCompute SQLを使用してデータを処理するには、MULTI INSERT文を実行して、データを異なる宛先テーブルまたはパーティションに同時に挿入します。

制限事項

MULTI INSERTステートメントを実行するときは、次の制限事項に注意してください。

  • 単一のMULTI INSERTステートメントには、最大255のINSERT操作を含めることができます。 INSERT操作の数が255を超えると、構文エラーが返されます。

  • MULTI INSERTステートメントでは、複数のINSERT操作に対して、パーティションテーブルで同じ宛先パーティションを指定することはできません。

  • MULTI INSERTステートメントでは、複数のINSERT操作に対して同じ非パーティションテーブルを指定することはできません。

構文

from <from_statement>
insert overwrite | into table <table_name1> [partition (<pt_spec1>)]
<select_statement1>
insert overwrite | into table <table_name2> [partition (<pt_spec2>)]
<select_statement2>
...;
  • from_statement: 必須です。 データソースを指定するFROM句。 たとえば、この句でソーステーブルの名前を指定できます。

  • table_name: 必須です。 データを挿入するテーブルの名前。

  • pt_spec: オプション。 データを挿入するパーティション。 定数のみが許可されます。 関数などの式は使用できません。 このパラメーターの値は、(partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...) 形式です。 pt_spec1pt_spec2で指定された2つのパーティションにデータを挿入する場合は、pt_spec1pt_spec2のパーティション情報が異なる必要があります。

  • select_statement: 必須です。 SELECT句は、ソーステーブルからターゲットテーブルまたはパーティションに挿入するデータを照会するために使用されます。

  • 例1: sale_detailテーブルのデータをsale_detail_multiテーブルの指定されたパーティションに挿入します。 パーティションには、中国本土で2010年と2011年の売上記録が格納されます。 サンプル文:

    -- Create a destination table named sale_detail_multi. 
    create table sale_detail_multi like sale_detail;
    
    -- Enable a full table scan only for the current session. -- Insert data from the sale_detail table into the sale_detail_multi table. 
    set odps.sql.allow.fullscan=true; 
    from sale_detail
    insert overwrite table sale_detail_multi partition (sale_date='2010', region='china' )
    select shop_name, customer_id, total_price
    insert overwrite table sale_detail_multi partition (sale_date='2011', region='china' )
    select shop_name, customer_id, total_price;
    
    -- Enable a full table scan only for the current session. Execute the SELECT statement to query the data in the sale_detail_multi table. 
    set odps.sql.allow.fullscan=true;
    select * from sale_detail_multi;
    
    -- The following result is returned: 
    +------------+-------------+-------------+------------+------------+
    | shop_name  | customer_id | total_price | sale_date  | region     |
    +------------+-------------+-------------+------------+------------+
    | s1         | c1          | 100.1       | 2010       | china      |
    | s2         | c2          | 100.2       | 2010       | china      |
    | s3         | c3          | 100.3       | 2010       | china      |
    | s1         | c1          | 100.1       | 2011       | china      |
    | s2         | c2          | 100.2       | 2011       | china      |
    | s3         | c3          | 100.3       | 2011       | china      |
    +------------+-------------+-------------+------------+------------+
  • 例2: 単一のMULTI INSERTステートメントで複数のINSERT操作に対して同じパーティションが指定されている場合、エラーが返されます。 誤った使用法のサンプルステートメント:

    from sale_detail
    insert overwrite table sale_detail_multi partition (sale_date='2010', region='china' )
    select shop_name, customer_id, total_price
    insert overwrite table sale_detail_multi partition (sale_date='2010', region='china' )
    select shop_name, customer_id, total_price;