如果需要向表中插入少量数据,您可以通过INSERT … VALUES
或VALUES TABLE
操作向数据量小的表中插入数据。
执行INSERT INTO
操作前需要具备目标表的修改权限(Alter)及源表的元信息读取权限(Describe)。授权操作请参见MaxCompute权限。
本文中的命令您可以在如下工具平台执行:
功能介绍
MaxCompute支持您通过INSERT … VALUES
或VALUES TABLE
操作向表中插入少量数据。
功能 | 说明 |
| 在业务测试阶段,您可以通过
|
| 如果您需要对插入的数据进行简单的运算,推荐使用MaxCompute的
|
使用限制
通过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。 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 | +------------+ | 2019-01-31 00:00:00 | | 2019-01-01 00:00:00 | | 2024-12-10 16:52:36 | +------------+