テーブルに少量のデータを挿入するには、INSERT … VALUES 文または VALUES TABLE 句を使用します。
INSERT INTO ステートメントを実行するには、宛先テーブルに対する ALTER 権限とソーステーブルに対する DESCRIBE 権限が必要です。権限の付与方法については、MaxCompute の権限をご参照ください。
以下のプラットフォームで文を実行できます。
機能
MaxCompute では、INSERT … VALUES または VALUES TABLE を使用して、テーブルに少量のデータを挿入できます。
操作 | 説明 |
| テストでは、
|
| 挿入されたデータで単純な計算を行うには、
|
制限事項
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>,...) t(<col1_name>, <col2_name>, ...)パラメーター | 必須 | 説明 |
table_name | はい | データを挿入するテーブルの名前。テーブルはあらかじめ存在している必要があります。 |
pt_spec | いいえ | 宛先パーティション。 形式は |
col_name | いいえ | 宛先列の名前。 |
col_value | いいえ | 対応する列の値。複数の値はカンマ (,) で区切ります。定数または非定数式 (ユーザー定義関数や組み込み関数など) を指定できます。列に値が指定されていない場合、列のデフォルト値は NULL になります。 |
例
例 1:
INSERT … VALUESを使用して、特定のパーティションにデータを挿入します。-- srcp という名前のパーティションテーブルを作成します。 CREATE TABLE IF NOT EXISTS srcp (key STRING,value BIGINT) PARTITIONED BY (p STRING); -- srcp テーブルにパーティションを追加します。 ALTER TABLE srcp ADD IF NOT EXISTS PARTITION (p='abc'); -- srcp テーブルの 'abc' パーティションにデータを挿入します。 INSERT INTO TABLE srcp PARTITION (p='abc') VALUES ('a',1),('b',2),('c',3); -- srcp テーブルをクエリします。 SELECT * FROM srcp WHERE p='abc'; -- 次の結果が返されます。 +------------+------------+------------+ | key | value | p | +------------+------------+------------+ | a | 1 | abc | | b | 2 | abc | | c | 3 | abc | +------------+------------+------------+例 2:
INSERT … VALUESを使用して、パーティション値を指定せずにデータを挿入します。-- srcp という名前のパーティションテーブルを作成します。 CREATE TABLE IF NOT EXISTS srcp (key STRING,value BIGINT) PARTITIONED BY (p STRING); -- パーティション値を指定せずに srcp テーブルにデータを挿入します。パーティション列は列リストに含まれます。 INSERT INTO TABLE srcp PARTITION (p)(key,p) VALUES ('d','20170101'),('e','20170101'),('f','20170101'); -- srcp テーブルをクエリします。 SELECT * FROM srcp WHERE p='20170101'; -- 次の結果が返されます。 +------------+------------+------------+ | key | value | p | +------------+------------+------------+ | d | NULL | 20170101 | | e | NULL | 20170101 | | f | NULL | 20170101 | +------------+------------+------------+例 3: SELECT 句を含む
INSERT文を使用して、複雑なデータ型のデータを挿入する。-- 複合データ型を持つ srcp という名前のパーティションテーブルを作成します。 CREATE TABLE IF NOT EXISTS srcp (key STRING,value ARRAY<INT>) PARTITIONED BY (p STRING); -- srcp テーブルにパーティションを追加します。 ALTER TABLE srcp ADD IF NOT EXISTS PARTITION (p='abc'); -- srcp テーブルの 'abc' パーティションにデータを挿入します。 INSERT INTO TABLE srcp PARTITION (p='abc') SELECT 'a', ARRAY(1, 2, 3); -- srcp テーブルをクエリします。 SELECT * FROM srcp WHERE p='abc'; -- 次の結果が返されます。 +------------+------------+------------+ | key | value | p | +------------+------------+------------+ | a | [1,2,3] | abc | +------------+------------+------------+例 4:
INSERT … VALUESを使用して DATETIME または TIMESTAMP データを書き込むには、VALUES句で型名を前に付けてリテラルを明示的にキャストする必要があります。-- srcp という名前のパーティションテーブルを作成します。 CREATE TABLE IF NOT EXISTS srcp (key DATETIME, value TIMESTAMP) PARTITIONED BY (p STRING); -- srcp テーブルにパーティションを追加します。 ALTER TABLE srcp ADD IF NOT EXISTS PARTITION (p='abc'); -- srcp テーブルの 'abc' パーティションにデータを挿入します。 INSERT INTO TABLE srcp PARTITION (p='abc') VALUES (datetime'2017-11-11 00:00:00', TIMESTAMP'2017-11-11 00:00:00.123456789'); -- srcp テーブルをクエリします。 SELECT * FROM srcp WHERE p='abc'; -- 次の結果が返されます。 +---------------------+-------------------------+-----+ | key | value | p | +---------------------+-------------------------+-----+ | 2017-11-11 00:00:00 | 2017-11-11 00:00:00.123 | abc | +---------------------+-------------------------+-----+例 5:
VALUES tableを使用してデータを挿入する。-- srcp という名前のパーティションテーブルを作成します。 CREATE TABLE IF NOT EXISTS srcp (key STRING,value BIGINT) PARTITIONED BY (p STRING); -- srcp テーブルにデータを挿入します。 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); -- srcp テーブルをクエリします。 SELECT * FROM srcp WHERE p='20170102'; -- 次の結果が返されます。 +------------+------------+------------+ | key | value | p | +------------+------------+------------+ | d4 | 2 | 20170102 | | e5 | 2 | 20170102 | | f6 | 2 | 20170102 | +------------+------------+------------+データベースは、
VALUESリストの値から列のデータ型 (この場合は STRING と BIGINT) を推測します。VALUES (…), (…) t(a, b)は、tという名前で列aとbを持つ一時テーブルを定義します。例 6:
SELECT * FROMとUNION ALLを使用する代わりに、VALUES テーブルを使用して定数テーブルを構築します。SELECT 1 c UNION ALL SELECT 2 c; -- 上記のステートメントは次のステートメントと同等です。 SELECT * FROM VALUES (1), (2) t(c); -- 次の結果が返されます。 +------------+ | c | +------------+ | 1 | | 2 | +------------+例 7:
VALUES テーブルの特殊な形式を使用して、FROM句を使用せずにデータを挿入します。-- srcp という名前のパーティションテーブルを作成します。 CREATE TABLE IF NOT EXISTS srcp (key STRING,value BIGINT) PARTITIONED BY (p STRING); -- srcp テーブルにデータを挿入します。 INSERT INTO TABLE srcp PARTITION (p) SELECT ABS(-1), LENGTH('abc'), GETDATE(); -- srcp テーブルをクエリします。 SET odps.sql.allow.fullscan=true; SELECT * FROM srcp; -- 結果の例: +------------+------------+---------------------+ | key | value | p | +------------+------------+---------------------+ | 1 | 3 | 2024-12-10 16:58:56 | +------------+------------+---------------------+例 8:非定数式の使用
SELECT * FROM VALUES (GETDATE()),(TO_DATE('20190101', 'yyyyMMdd')),(LASTDAY(DATETIME '2019-01-01 01:10:00')) t(d);次の結果が返されます。
+---------------------+ | d | +---------------------+ | 2024-12-10 16:52:36 | | 2019-01-01 00:00:00 | | 2019-01-31 00:00:00 | +---------------------+