ここでは、INSERT … VALUES コマンド操作について説明します。

検証用に、小さなデータテーブルに基本データを用意します。 INSERT … VALUES 文を使用して、迅速にテストデータを検証用のテーブルに書き込むことができます。

現時点では、INSERT OVERWRITE で列を挿入することはできません。代わりに INSERT INTO をご使用ください。

文の形式:
INSERT INTO TABLE tablename 
[PARTITION (partcol1=val1, partcol2=val2 ...)][co1name1,colname2...] 
[VALUES (col1_value,col2_value,...),(col1_value,col2_value,...),...]
例 1:
drop table if exists srcp;
create table if not exists srcp (key string ,value bigint) partitioned by (p string);
insert into table srcp partition (p='abc') values ('a',1),('b',2),('c',3);
上記の文が正常に実行されると、パーティション 'abc' は次のようになります。

| key | value | p |

| a | 1 | abc |
| b | 2 | abc |
| c | 3 | abc |
			

テーブルに複数の列があり、一部の列にデータを挿入するには、次のように INSERT 関数にリストを使用します。

例 2:
drop table if exists srcp;
create table if not exists srcp (key string ,value bigint) partitioned by (p string);
insert into table srcp partition (p)(key,p) values ('d','20170101'),('e','20170101'),('f','20170101');
上記の文が正常に実行されると、パーティション '20170101' は、次のようになります。

| key | value | p |

| d | NULL | 20170101 |
| e | NULL | 20170101 |
| f | NULL | 20170101 |
			

VALUES で指定されない列は、デフォルトで NULL になります。 INSERT 関数にリストを指定する際、すべての列を VALUES で指定する必要はありません。'INSERT INTO…SELECT…' も同様に使用できます。

実際、VALUES は、INSERT 文でのみ使用するわけではありません。DML 文でも使用できます。

INSERT…VALUES メソッドには制約があり、値を指定する必要があります。 挿入されたデータに対して単純な操作を実行するには、MaxCompute のテーブル関数である VALUES を使用します。詳細は、例 3 をご参照ください。

例 3:
drop table if exists srcp;
create table if not exists srcp (key string ,value bigint) partitioned by (p string);
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);

VALUES (…), (…) t (a, b) は、テーブル t の定義であり、列は a および b、各列のデータ型は VALUES のリストから派生した (a string, b bigint) となります。 そうすることにより、物理テーブルを用意することなしに、任意のデータを含む複数行の仮想テーブルに対して、任意の処理を実行できます。

上記の文が正常に実行されると、'20170102' のパーティションは、次のようになります。

| key | value | p |

| d4 | 2 | 20170102 |
| e5 | 2 | 20170102 |
| f6 | 2 | 20170102 |
			
VALUES TABLE を使用して、次のように select * from dual や union all の組み合わせを置き換えて、定数を指定することもできます。 例
select 1 c from dual 
union all
select 2 c from dual;
--等同于 
select * from values (1), (2) as t (c);
VALUES の特殊な使用方法は次のとおりです。
select abs(-1), length('abc'), getdate();

上記の文のように、SELECT 文の式のリストに、アップストリームテーブルのデータが含まれない場合、SELECT は FROM なしで実行できます。 実際の処理としては、1 行 0 列の、データの存在しないダミーテーブルより抽出しています。 これにより、DUAL テーブルを作成せずに、UDF などの関数を検証することが可能となります。

  • VALUES には定数のみを指定でき、ARRAY といった複雑なデータ型を含む関数を使用することはできません。 現時点では、MaxCompute では、対応する定数を構成できません。 次のような文に書き換えます。
    insert into table srcp (p ='abc') select 'a',array('1', '2', '3');.
    この文でも、同様の結果が得られます。
  • VALUES で datetime または timestamp を書き込むには、VALUES 文に型名を指定します。
    insert into table srcp (p ='abc') values (datetime'2017-11-11
                00:00:00',timestamp'2017-11-11 00:00:00.123456789');