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

MaxCompute:INSERT INTO VALUES

最終更新日:Mar 26, 2026

MaxCompute テーブルに少数の行を直接挿入するには、通常、開発およびテスト中に INSERT ... VALUES または VALUES TABLE を使用します。

大規模なデータセット (数十行以上) の場合は、代わりに Tunnel コマンドを使用して TXT または CSV ファイルをアップロードします。「テーブルへのデータインポート

前提条件

開始する前に、以下があることを確認してください。

  • 宛先テーブルに対する ALTER 権限

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

詳細については、「MaxCompute 権限」をご参照ください。

サポートされているプラットフォーム

これらのステートメントは、以下のいずれかのプラットフォームで実行します。

操作

操作使用するタイミング
INSERT ... VALUESテストフェーズ中にテストテーブルに数行または十数行を挿入します。
VALUES TABLEインラインデータに対して簡単な計算を実行します。INSERT ステートメントおよびデータ操作言語 (DML) ステートメントで使用できます。

制限事項

INSERT ... VALUES または VALUES TABLE を使用する場合、列指定のある INSERT OVERWRITE はサポートされていません。代わりに INSERT INTO を使用してください。

構文

INSERT ... VALUES

INSERT INTO TABLE <table_name>
[PARTITION (<pt_spec>)][(<col1_name>, <col2_name>, ...)]
VALUES (<col1_value>, <col2_value>, ...), (<col1_value>, <col2_value>, ...), ...

VALUES TABLE

VALUES (<col1_value>, <col2_value>, ...), (<col1_value>, <col2_value>, ...) <table_name> (<col1_name>, <col2_name>, ...) ...

パラメーター

パラメーター必須説明
table_nameはいデータを挿入する既存のテーブルの名前。
pt_specいいえ宛先パーティション。形式:(partition_col1 = partition_col_value1, partition_col2 = partition_col_value2, ...)。パーティションテーブルに挿入する場合は必須です。
col_nameいいえ宛先列の名前。
col_valueいいえ挿入する値。リテラル、定数式、または非定数式 (ビルトイン関数やユーザー定義関数 (UDF) 式など) を受け入れます。col_name にリストされていない列は NULL にデフォルト設定されます。

注意事項

VALUES でサポートされている値の型

  • リテラル (文字列、整数、10 進数)

  • 定数式

  • ビルトイン関数や UDF 式などの非定数式

VALUES でサポートされていない値の型

以下は、VALUES リストに直接使用できません。代わりに SELECT 式を使用してください。

  • ARRAY 以外の複合データ型。ARRAY データを挿入するには、ARRAY() とともに SELECT を使用します。「ARRAY データの挿入」をご参照ください。

日付と時刻の型

DATETIME または TIMESTAMP データを挿入するには、VALUES でデータ型プレフィックスを指定します。例: datetime'2017-11-11 00:00:00' または TIMESTAMP'2017-11-11 00:00:00.123456789'

特定のパーティションへの行の挿入

パーティションテーブルを作成し、指定されたパーティションに 3 行を挿入します。

-- Create a partitioned table named srcp.
CREATE TABLE IF NOT EXISTS srcp (key STRING, value BIGINT) PARTITIONED BY (p STRING);

-- Add the abc partition to the srcp table.
ALTER TABLE srcp ADD IF NOT EXISTS PARTITION (p='abc');

-- Insert three rows into the abc partition.
INSERT INTO TABLE srcp PARTITION (p='abc') VALUES ('a', 1), ('b', 2), ('c', 3);

-- Query the partition to verify.
SELECT * FROM srcp WHERE p='abc';

-- Return result
+------------+------------+------------+
| key        | value      | p          |
+------------+------------+------------+
| a          | 1          | abc        |
| b          | 2          | abc        |
| c          | 3          | abc        |
+------------+------------+------------+

インラインパーティション値を使用した行の挿入

PARTITION 句ではなく、VALUES リストにパーティション列の値を直接指定します。

-- Create a partitioned table named srcp.
CREATE TABLE IF NOT EXISTS srcp (key STRING, value BIGINT) PARTITIONED BY (p STRING);

-- Insert rows and derive the partition value from the VALUES list.
INSERT INTO TABLE srcp PARTITION (p)(key, p) VALUES ('d', '20170101'), ('e', '20170101'), ('f', '20170101');

-- Query the partition to verify.
SELECT * FROM srcp WHERE p='20170101';

-- Return result
+------------+------------+------------+
| key        | value      | p          |
+------------+------------+------------+
| d          | NULL       | 20170101   |
| e          | NULL       | 20170101   |
| f          | NULL       | 20170101   |
+------------+------------+------------+
value 列は列リストにリストされていないため、NULL にデフォルト設定されます。

ARRAY データの挿入

ARRAY リテラルは VALUES に直接使用できないため、代わりに ARRAY() とともに SELECT 式を使用してください。

-- Create a partitioned table named srcp.
CREATE TABLE IF NOT EXISTS srcp (key STRING, value ARRAY<INT>) PARTITIONED BY (p STRING);

-- Add the abc partition to the srcp table.
ALTER TABLE srcp ADD IF NOT EXISTS PARTITION (p='abc');

-- Insert an ARRAY value using a SELECT expression.
INSERT INTO TABLE srcp PARTITION (p='abc') SELECT 'a', ARRAY(1, 2, 3);

-- Query the partition to verify.
SELECT * FROM srcp WHERE p='abc';

-- Return result
+------------+------------+------------+
| key        | value      | p          |
+------------+------------+------------+
| a          | [1,2,3]    | abc        |
+------------+------------+------------+

DATETIME および TIMESTAMP データの挿入

型推論エラーを回避するために、日付と時刻のリテラルにデータ型名をプレフィックスとして付けます。

-- Create a partitioned table named srcp.
CREATE TABLE IF NOT EXISTS srcp (key STRING, value TIMESTAMP) PARTITIONED BY (p STRING);

-- Add the abc partition to the srcp table.
ALTER TABLE srcp ADD IF NOT EXISTS PARTITION (p='abc');

-- Insert DATETIME and TIMESTAMP values with explicit type prefixes.
INSERT INTO TABLE srcp PARTITION (p='abc') VALUES (datetime'2017-11-11 00:00:00', TIMESTAMP'2017-11-11 00:00:00.123456789');

-- Query the partition to verify.
SELECT * FROM srcp WHERE p='abc';

-- Return result
+------------------------+-------------------------+------------+
| key                    | value                   | p          |
+------------------------+-------------------------+------------+
| 2017-11-11 00:00:00    | 2017-11-11 00:00:00.123 | abc        |
+------------------------+-------------------------+------------+

計算列での VALUES TABLE の使用

インライン値を名前付きテーブルとして参照し、INSERT 中に関数を適用します。

-- Create a partitioned table named srcp.
CREATE TABLE IF NOT EXISTS srcp (key STRING, value BIGINT) PARTITIONED BY (p STRING);

-- Insert data with computed expressions derived from an inline VALUES table t(a, b).
INSERT INTO TABLE srcp PARTITION (p)
SELECT concat(a, b), length(a) + length(b), '20170102'
FROM VALUES ('d', 4), ('e', 5), ('f', 6) t(a, b);

-- Query the partition to verify.
SELECT * FROM srcp WHERE p='20170102';

-- Return result
+------------+------------+------------+
| key        | value      | p          |
+------------+------------+------------+
| d4         | 2          | 20170102   |
| e5         | 2          | 20170102   |
| f6         | 2          | 20170102   |
+------------+------------+------------+

VALUES (...) t(a, b) は、列 ab を持つ t という名前のインラインテーブルを定義します。データ型は VALUES リストから推論されます。a は STRING で、b は BIGINT です。

UNION ALL なしでの定数テーブルの構築

連結された SELECT ... UNION ALL ステートメントの簡潔な代替手段として VALUES TABLE を使用します。

-- These two statements are equivalent:
SELECT 1 c UNION ALL SELECT 2 c;

SELECT * FROM VALUES (1), (2) t(c);

-- Return result
+------------+
| c          |
+------------+
| 1          |
| 2          |
+------------+

FROM 句なしでの VALUES TABLE の使用

VALUES TABLE を使用すると、どのテーブルも参照せずに、関数を呼び出す SELECT ステートメントを実行できます。基盤となる実装は、匿名単一行、ゼロ列 VALUES テーブルから選択するため、DUAL テーブルは不要です。

-- Create a partitioned table named srcp.
CREATE TABLE IF NOT EXISTS srcp (key STRING, value BIGINT) PARTITIONED BY (p STRING);

-- Insert a row computed entirely from built-in functions.
INSERT INTO TABLE srcp PARTITION (p)
SELECT ABS(-1), LENGTH('abc'), GETDATE();

-- Query all rows.
SET odps.sql.allow.fullscan=true;
SELECT * FROM srcp;

-- Return result
+------------+------------+---------------------+
| key        | value      | p                   |
+------------+------------+---------------------+
| 1          | 3          | 2024-12-10 16:58:56 |
+------------+------------+---------------------+

VALUES での非定数式の使用

VALUES リストで関数呼び出しを列値として直接渡します。

SELECT * FROM VALUES (GETDATE()), (TO_DATE('20190101', 'yyyyMMdd')), (LASTDAY(DATETIME '2019-01-01 01:10:00')) t(d);

結果:

+---------------------+
| d                   |
+---------------------+
| 2019-01-31 00:00:00 |
| 2019-01-01 00:00:00 |
| 2024-12-10 16:52:36 |
+---------------------+