
# INSERT
#### 语法
INSERT { INTO \| OVERWRITE } \[TABLE\] table_name \[(column_list)\] \[ PARTITION (partition_clause)\] {select_statement \| VALUES (value \[, value ...\]) \[, (value \[, value ...\]) ...\] }
FROM from_statement INSERT OVERWRITE TABLE tablename1 \[PARTITION (partcol1=val1, partcol2=val2 ...)\] select_statement
FROM from_statement INSERT INTO TABLE tablename1 \[PARTITION (partcol1=val1, partcol2=val2 ...)\] select_statement
#### 限制
如果数据表中只有一个字段，且字段类型为row、struct，那么插入数据时需要用row对类型进行包裹。
```
-- 单字段表插入复杂类型需要用row()包裹
CREATE TABLE test_row (id row(c1 int, c2 string));
INSERT INTO test_row values row(row(1, 'test'));
--多字段表复杂类型可以直接插入
CREATE TABLE test_multy_value(id int, col row(c1 int, c2 string));
INSERT INTO test_multy_value values (1,row(1,'test'));
```
#### 描述
- 向表中插入新的数据行。
- 如果指定了列名列表，那么这些列名列表必须与query语句产生列表名完全匹配。表中不在列名列表中的每一列，其值会设置为null。
- 如果没有指定列名列表，则query语句产生的列必须与将要插入的列完全匹配。
- 使用insert into时，会往表中追加数据，而使用insert overwrite时，如果表属性"auto.purge"被设置为"true"，直接删除原表数据，再写入新的数据。
- 如果对象表是分区表时，insert overwrite会删除对应分区的数据而非所有数据。
- insert into后面的table关键字为可选，以兼容hive语法。
 
#### 示例
- 创建fruit和fruit_copy表：
  ```
  create table fruit (name varchar,price double);
  create table fruit_copy (name varchar,price double);
  ```
  
- 向fruit表中插入一行数据：
  ```
  insert into fruit values('LIchee',32);
  -- 兼容写法示例,带上table关键字
  insert into table fruit values('Cherry',88);
  ```
  
- 向fruit表中插入多行数据：
  ```
  insert into fruit values('banana',10),('peach',6),('lemon',12),('apple',7);
  ```
  
- 将fruit表中的数据行加载到fruit_copy表中，执行后表中有5条记录：
  ```
  insert into fruit_copy select * from fruit;
  ```
  
- 先清空fruit_copy表，再将fruit中的数据加载到表中，执行之后表中有2条记录：
  ```
  insert overwrite fruit_copy select *  from fruit limit 2;
  ```
  
- 对于varchar类型，仅当目标表定义的列字段长度大于源表的实际字段长度时，才可以使用INSERT... SELECT...的形式从源表中查数据并且插入到目标表：
  ```
  create table varchar50(c1 varchar(50));
  insert into varchar50 values('hetuEngine');
  create table varchar100(c1 varchar(100));
  insert into varchar100 select * from varchar50;
  ```
  

- 分区表使用insert overwrite语句时，只会清理插入值所在分区的数据，而不是整个表：
  ```
  --创建表
  create table test_part (id int, alias varchar) partitioned by (dept_id int, status varchar);
  insert into test_part  partition(dept_id=10, status='good') values (1, 'xyz'), (2, 'abc');
  select * from test_part order by id;
   id | alias | dept_id | status 
  ---|---|---|--------
    1 | xyz   |      10 | good   
    2 | abc   |      10 | good   
  (2 rows)
  --清理分区partition(dept_id=25, status='overwrite')，并插入一条数据
  insert overwrite test_part (id, alias, dept_id, status) values (3, 'uvw', 25, 'overwrite');
   select * from test_part ;
   id | alias | dept_id |  status   
  ---|---|---|-----------
    1 | xyz   |      10 | good      
    2 | abc   |      10 | good      
    3 | uvw   |      25 | overwrite
  --清理分区partition(dept_id=10, status='good')，并插入一条数据
  insert overwrite test_part (id, alias, dept_id, status) values (4, 'new', 10, 'good');
  select * from test_part ;
   id | alias | dept_id |  status   
  ---|---|---|-----------
    3 | uvw   |      25 | overwrite 
    4 | new   |      10 | good      
  (2 rows)
  --分区表插入数据
  create table test_p_1(name string, age int) partitioned by (province string, city string);
   create table test_p_2(name string, age int) partitioned by (province string, city string);
   
  -- 填充数据到test_p_1
   insert into test_p_1 partition (province = 'hebei', city= 'baoding') values ('xiaobei',15),( 'xiaoming',22);
  -- 根据test_p_1 插入数据到test_p_2
  -- 方式一
  from test_p_1 insert into table test_p_2 partition (province = 'hebei', city= 'baoding') select name,age;
   
  -- 方式二
  insert into test_p_2 partition(province = 'hebei', city= 'baoding') select name,age from test_p_1;
  ```
  
 
 #### 注意事项
默认无法对外部表（external）插入数据的，如需使用该功能，可以给数据源添加配置。
- 共部署情况 登录FusionInsight Manager，选择"集群 \> 服务 \> HetuEngine \> 概览"，单击"HSConsole WebUI"的HSConsole链接进入计算实例界面。
  然后选择"数据源 \>hive \> 编辑 \> 自定义配置 \> 增加"来新增一条用户自定义配置项，名称为"hive.non-managed-table-writes-enabled"，值为"true"。
  
- 独立部署Hive情况 登录FusionInsight Manager，选择"集群 \> 服务 \> HetuEngine \> 概览"，单击"HSConsole WebUI"的HSConsole链接进入计算实例界面。
  然后选择"数据源 \>*{hive数据源名称}* \> 编辑 \> 自定义配置 \> 增加"来新增一条用户自定义配置项，名称为"hive.non-managed-table-writes-enabled"，值为"true"。
  ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/zh-cn_image_0000002128270849.png "点击放大")
  
 
