---
order: 12
navTitle: merge.ftl
---
# merge.ftl

在merge.ftl文件中构造一个SQL模板，使数据库支持一个将表或SQL查询结果插入或更新到目标表的`merge into`语句以及一个将特定values插入或更新到目标表的`merge into`语句。

```json
INSERT<#if !(updateFields??)> IGNORE</#if> INTO ${tableName}<#if insertFields??> (${insertFields})</#if>
<#--来源是数据表-->
<#if usingTable??>
	SELECT ${insertValues} FROM ${usingTable} ${usingAlias}<#lt>
<#elseif updateFields??><#--来源是sql，且有update列表，因为update列表中需要别名，需要包一层sql-->
	SELECT ${insertValues} FROM (<#lt>
	${usingSql}<#lt>
	) ${usingAlias}<#lt>
<#else>
	${usingSql}<#lt>
</#if>
<#--有update-->
<#if updateFields??>ON DUPLICATE KEY UPDATE ${updateFields}</#if>
```

:::tip 提示

1. 若数据库不支持`merge into`语句，可以配置为类似功能的`insert into`语句。
2. 若不配置此模板，将默认使用标准的`merge into`语句。
   :::

### SQL模板参数{#sql-template-parameters}

- `tableName`：目标数据表表名。
- `tableAlias`：目标数据表的别名。
- `insertFields`：插入的字段名列表，此参数不为空。直接引用此参数会输出经过逗号分割的字段名，如`field1,field2...`。
- `insertValues`：insertFields字段列表对应的值，引用此参数时的输出格式同`insertFields`。
- `updateFields`：当数据已存在时执行的更新，直接引用此参数可以输出对应的字段名和值，如`field1=value1,field2=value2...`；如果不存在此参数，表示忽略已存在的数据。
- `usingTable`：数据来源表表名，若此参数存在，表示需要将此表的数据合并到目标表，要求表中的字段名与目标表保持一致。
- `usingSql`：执行merge的数据来源sql，若`usingTable`为空，则取这个值的参数。
- `usingAlias`：数据来源表或者sql的别名，此参数不为空。
