如果需要向表中插入少量資料,您可以通過insert … values
或values table
操作向資料量小的表中插入資料。
執行insert into
操作前需要具備目標表的修改許可權(Alter)及源表的元資訊讀取許可權(Describe)。授權操作請參見MaxCompute許可權。
本文中的命令您可以在如下工具平台執行:
功能介紹
MaxCompute支援您通過
insert … values
或values table
操作向表中插入少量資料。功能 | 說明 |
insert … values | 在業務測試階段,您可以通過insert … values 操作向表中插入資料執行簡單測試:
|
values table | 如果您需要對插入的資料進行簡單的運算,推薦使用MaxCompute的values table 。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:可選。目標表中列對應的列值。多個列值之間用英文逗號(,)分隔。該列值支援常量,同時還支援非常量運算式,例如自訂函數或內建函數運算式。未指定列值時,預設值為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:使用複雜資料類型構造常量,通過
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
,列為a
和b
,資料類型分別為STRING和BIGINT的表。列的類型需要從values
列表中推導。 - 樣本6:取代
select * from
與union 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 | +------------+