本文为您介绍如何使用INSERT … VALUES语句在数据量小的表中插入数据。

背景信息

在业务测试阶段,您需要在表中插入数据执行简单测试:
  • 如果插入几条或十几条数据,您可以使用INSERT … VALUES语句在测试表中快速写入数据。
  • 如果插入几十条数据,您可以通过Tunnel上传一个TXTCSV数据文件导入数据,详情请参见导入数据或者通过DataWorks的导入功能快速导入一个数据文件,详情请参见界面功能点介绍
注意 INSERT OVERWRITE不支持指定插入列,只能使用INSERT INTO指定插入列。

命令说明

执行命令如下。
INSERT INTO TABLE tablename 
[PARTITION (partcol1=val1, partcol2=val2,...)][(co1name1,colname2,...)] 
[VALUES (col1_value,col2_value,...),(col1_value,col2_value,...),...]
参数说明:
  • tablename:待插入数据的表名称。该表为已经存在的表。
  • PARTITION (partcol1=val1, partcol2=val2,...)]:分区信息。如果需要更新的表为分区表,您需要指定该参数。
  • [(co1name1,colname2,...):目标表中的字段名称。
  • col_value:目标表中列对应的列值。多个列值之间用逗号(,)分隔。该列值必须为常量,未指定列值时,默认值为NULL。
    说明
    • VALUES只支持常量,不支持函数。复杂数据类型无法构造对应的常量,例如ARRAY,此时您可以通过如下语句在VALUES中使用ARRAY类型。
      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');

示例

  • 特定分区内插入数据。
    --删除已存在的表srcp。
    DROP TABLE IF EXISTS srcp;
    --创建分区表srcp。
    CREATE TABLE IF NOT EXISTS srcp (key string,value bigint) PARTITIONED BY (p string);
    --给表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 |
    +-----+------------+---+
  • 非特定分区内插入数据
    --删除已存在的表srcp。
    DROP TABLE IF EXISTS srcp;
    --创建分区表srcp。
    CREATE TABLE IF NOT EXISTS srcp (key string,value bigint) PARTITIONED BY (p string);
    --给表srcp的指定分区def中插入数据。
    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 |
    +-----+------------+---+

VALUES TABLE功能

使用INSERT … VALUES时,VALUES后的取值必须是常量。如果需要对插入的数据进行简单的运算,建议使用MaxCompute的VALUES TABLE功能。

VALUES TABLE可以在INSERT语句和任何DML语句中使用。VALUES TABLE功能的使用方式如下:
  • 在没有任何物理表时,您可以模拟一个有任意数据的、多行的表,并进行任意运算。
    例如,VALUES (…), (…) t(a, b)相当于定义了一个名为t,列为ab,类型分别为STRING和BIGINT的表。列的类型需要从VALUES列表中推导。
    --删除已存在的表srcp。
    DROP TABLE IF EXISTS srcp;
    --创建分区表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 |
    +-----+------------+---
  • 取代SELECT * FROM DUALUNION ALL组合的方式,构造常量表,命令示例如下。
    SELECT 1 c FROM DUAL 
    UNION ALL
    SELECT 2 c FROM DUAL;
    --等同于以下语句。
    SELECT * FROM VALUES (1), (2) AS t(c);
  • VALUES TABLE的特殊形式。您可以不通过FROM语句,直接执行SELECTSELECT表达式列表中不可以出现上游表的数据),命令示例如下。其底层实现为从一个1行0列的匿名VALUES表中进行选取操作。在测试UDF或其它函数时,您可以通过该方式免去手工创建DUAL表的过程。
    select abs(-1), length('abc'), getdate();