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_spec1とpt_spec2で指定された2つのパーティションにデータを挿入する場合は、pt_spec1とpt_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;