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

MaxCompute:Multi Insert

最終更新日:Mar 26, 2026

1 つのソーステーブルから複数の送信先テーブルまたはパーティションにデータを書き込む必要がある場合、MULTI INSERT を使用すると、単一の SQL ステートメントでこれを実行できます。

以下のいずれかのプラットフォームで MULTI INSERT ステートメントを実行できます:

前提条件

開始する前に、以下の条件を満たしていることを確認してください。

  • 各送信先テーブルに対する ALTER 権限

  • ソーステーブルのメタデータに対する DESCRIBE 権限

権限の付与方法については、「MaxCompute の権限」をご参照ください。

制限事項

  • 単一の MULTI INSERT ステートメントでは、最大 255 個の INSERT 操作をサポートします。この上限を超えると構文エラーが発生します。

  • パーティションテーブル内の各送信先パーティションは、ステートメント全体のすべての INSERT 操作で 1 回のみ指定できます。

  • 非パーティション化テーブルは、ステートメント全体のすべての INSERT 操作で 1 回のみ指定できます。

構文

-- 1 回のソーススキャンから複数の送信先へ挿入
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, ...)。各 INSERT 操作は異なるパーティションを対象とする必要があります。
select_statementはい挿入するデータを読み取る SELECT 句です。

注意事項

  • 開発中に全表スキャンを有効にするには、セッション開始時に set odps.sql.allow.fullscan=true; を実行します。

サンプル

複数のパーティションへの挿入

このサンプルでは、送信先テーブルを作成し、sale_detail から取得した販売データを、単一のステートメントで sale_detail_multi の 2 つの別々のパーティションに挿入します。

-- ソーステーブルと同じスキーマを持つ送信先テーブルを作成
CREATE TABLE sale_detail_multi LIKE sale_detail;

-- このセッションで全表スキャンを有効化した後、2 つのパーティションに一度に挿入
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;

-- 結果を確認
SET odps.sql.allow.fullscan=true;
SELECT * FROM sale_detail_multi;

期待される出力:

+------------+-------------+-------------+------------+------------+
| 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 つの INSERT 操作が同一のパーティション (sale_date='2010', region='china') を対象としているためです。各パーティションは、1 つの MULTI INSERT ステートメント内で 1 回のみ指定できます。

-- エラー:単一の MULTI 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;
  • 例 3:同一テーブルの異なるパーティションに対して、単一のステートメント内で insert overwriteinsert into を併用することはできません。この操作はエラーを引き起こします。以下は 誤ったコマンド例 です。

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