
# INSERT INTO
#### 命令功能
INSERT命令用于将SELECT查询结果加载到Hudi表中。
#### 命令格式
**INSERT INTO** *tableIndentifier select query;*
#### 参数描述
表1INSERT INTO参数 
| **参数**           | **描述**                 |
|:---|:---|
| tableIndentifier | 需要执行INSERT命令的Hudi表的名称。 |
| select query     | 查询语句。                  |
   
#### 注意事项
- 写入模式：Hudi对于设置了主键的表支持三种写入模式，用户可以设置参数hoodie.sql.insert.mode来指定Insert模式，默认为upsert。
  ```
  hoodie.sql.insert.mode = upsert
  ```
  - strict模式，Insert 语句将保留 COW 表的主键唯一性约束，不允许重复记录。如果在插入过程中已经存在记录，则会为COW表执行 HoodieDuplicateKeyException；对于MOR表，该模式与upsert模式行为一致。
  
  - non-strict模式，对主键表采用insert处理。
  
  - upsert模式，对于主键表的重复值进行更新操作。
   
- 在提交Spark SQL作业时，用户可以在设置中配置以下参数，切换bulk insert作为Insert语句的写入方式。
  ```
  hoodie.sql.bulk.insert.enable = true
  hoodie.sql.insert.mode = non-strict
  ```
  
- 也可以设置hoodie.datasource.write.operation的来控制insert语句的写入方式，可选包括bulk_insert、insert、upsert。（注意：会覆盖配置的hoodie.sql.insert.mode的结果）
  ```
  hoodie.datasource.write.operation = upsert
  ```
  
 
#### 示例
```
insert into h0 select 1, 'a1', 20;
-- insert static partition
insert into h_p0 partition(dt = '2021-01-02') select 1, 'a1';
-- insert dynamic partition
insert into h_p0 select 1, 'a1', dt;
-- insert dynamic partition
insert into h_p1 select 1 as id, 'a1', '2021-01-03' as dt, '19' as hh;
-- insert overwrite table
insert overwrite table h0 select 1, 'a1', 20;
-- insert overwrite table with static partition
insert overwrite h_p0 partition(dt = '2021-01-02') select 1, 'a1';
-- insert overwrite table with dynamic partition
insert overwrite table h_p1 select 2 as id, 'a2', '2021-01-03' as dt, '19' as hh;
```
#### 权限需求
由DLI提供的元数据服务
- SQL权限：
  
  | **database** | **table**         |
  |:---|:---|
  | 无            | INSERT_INTO_TABLE |
     
  
- 细粒度权限：dli:table:insertIntoTable
由LakeFormation提供的元数据服务，权限配置详见LakeFormation文档。
#### 系统响应
可以确认任务状态成功，运行QUERY语句查看表中写入的数据。
