全部產品
Search
文件中心

MaxCompute:VALUES

更新時間:Jun 19, 2024

如果需要向表中插入少量資料,您可以通過insert … valuesvalues table操作向資料量小的表中插入資料。

執行insert into操作前需要具備目標表的修改許可權(Alter)及源表的元資訊讀取許可權(Describe)。授權操作請參見MaxCompute許可權

本文中的命令您可以在如下工具平台執行:

功能介紹

MaxCompute支援您通過insert … valuesvalues table操作向表中插入少量資料。
功能說明
insert … values在業務測試階段,您可以通過insert … values操作向表中插入資料執行簡單測試:
  • 如果插入幾條或十幾條資料,您可以通過insert … values語句快速向測試表中寫入資料。
  • 如果插入幾十條資料,您可以通過Tunnel上傳一個TXTCSV格式的資料檔案匯入資料,詳情請參見匯入資料
values table如果您需要對插入的資料進行簡單的運算,推薦使用MaxCompute的values tablevalues table可以在insert語句和任何DML語句中使用。功能如下:
  • 在沒有任何物理表時,您可以類比一個有任意資料的、多行的表,並進行任意運算。
  • 取代select * fromunion all組合的方式,構造常量表。
  • values table支援特殊形式。您可以不通過from子句,直接執行selectselect運算式列表中不可以出現其它表中的資料。其底層實現為從一個1行0列的匿名VALUES表中進行選取操作。在測試UDF或其它函數時,您可以通過該方式免去手工建立DUAL表的過程。

使用限制

通過insert … valuesvalues 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:可選。目標表中列對應的列值。多個列值之間用英文逗號(,)分隔。該列值支援常量,同時還支援非常量運算式,例如自訂函數或內建函數運算式。未指定列值時,預設值為NULL。
    說明
    • 複雜資料類型無法構造對應的常量,例如ARRAY,您可以在values中使用ARRAY類型,請參見樣本3
    • 通過values寫入DATETIME或TIMESTAMP資料類型時,需要在values中指定類型名稱,請參見樣本4

使用樣本

  • 樣本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:使用複雜資料類型構造常量,通過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 string, 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 (…), (…) t(a, b)相當於定義了一個名為t,列為ab,資料類型分別為STRING和BIGINT的表。列的類型需要從values列表中推導。
  • 樣本6:取代select * fromunion all組合的方式,構造常量表。命令樣本如下:
    select 1 c union all select 2 c;
    --等價於如下語句。
    select * from values (1), (2) t(c);
    
    --返回結果。
    +------------+
    | c          |
    +------------+
    | 1          |
    | 2          |
    +------------+
  • 樣本7:通過values table的特殊形式插入資料,不帶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。
    select * from srcp;
    
    --返回結果。
    +------------+------------+------------+
    | key        | value      | p          |
    +------------+------------+------------+
    | 1          | 3          | 2020-11-25 18:39:48 |
    +------------+------------+------------+
  • 樣本8:使用非常量運算式,命令樣本如下:
    select * from values ('a'),(to_date('20190101', 'yyyyMMdd')),(getdate()) t(d);
    返回結果如下:
    +------------+
    | d          |
    +------------+
    | 2021-02-01 18:01:38 |
    | 2019-01-01 00:00:00 |
    | a          |
    +------------+