> ## Documentation Index
> Fetch the complete documentation index at: https://help.dingtalk.io/llms.txt
> Use this file to discover all available pages before exploring further.

# UPSERT - 插入或更新

> 本文详细介绍了UPSERT()函数的使用方法，包括其格式、参数说明以及通过具体案例展示如何在不同场景下利用UPSERT()来实现数据表之间的插入或更新操作。

UPSERT()函数用于插入或更新数据到目标表单中。在插入数据时，如果目标表单中已存在该条数据，那么将执行更新数据，如果目标表单中不存在该条数据，那么将执行插入数据。

## 格式

`UPSERT()`函数的格式为：

```javascript theme={"theme":{"light":"github-light","dark":"github-dark"}}
UPSERT (目标表, 主条件, 子条件, 目标列1, 目标值1, 目标列2, 目标值2......)
```

* 目标表： 要插入/更新数据的目标表单。

* 主条件： 主条件用于定位更新哪条数据。主条件是由逻辑函数构成：

* 子条件：

* 目标列：

* 目标值： 指目标列要更新成的值，目标值可以由当前录入表的某个组件值，要更新目标表某个组件值，固定值通过其他函数组合而成。

## 使用案例

## 案例一：普通组件数据插入时，更新目标表的普通组件数据

* 使用的表单

* 需求

进货表中录入一个商品，如果存货表中存在相同商品名的数据，则在该商品的存货量的基础上加上进货量。如果存货表中查找不到该商品名，则往存货表中插入该商品名，存货量为进货量。

* 公式配置详情&公式解析

<Frame>
  ![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1612083665852-1c96f5ee-e101-4594-9922-be56f0a331a4.png)
</Frame>

**公式解析：**

* 目标表： 存货表。
* 主条件 ：EQ(存货表.商品名, 商品名)。更新的数据是存货表中商品名为录入表录入数据的商品名。
* 子条件 ：由于更新的是「存货表」中的普通组件：商品名和存货量，不涉及明细，因此子条件填写为""
* 目标列： 存货表.商品名。
* 目标值： 商品名。 如果查找不到数据，在插入数据时，存货表的商品名值为进货表的商品名值。
* 目标列： 存货表.存货量
* 目标值： 存货表.存货量 + 进货量。 根据条件匹配到存货商品后，在原来存货量的基础上加上这次的进货量。

## 案例二：子表单组件数据插入时，更新目标表的普通组件数据

* 使用的表单

* 需求

进货表下有进货明细，一次可以录入多个商品。对于录入的多个商品，在存货表中假如查找不到对应商品(商品名和商品类别都相同时，表示商品相同)，则插入数据。如果能找到对应商品，则更新对应商品的存货量(存货量=原来的存货量+进货量)。

* 公式配置详情&公式解析

<Frame>
  ![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1621324627373-3b5e775b-7fa6-4db3-a05b-6121cdcaa9fc.png)
</Frame>

## 案例三：普通组件数据插入时，更新到目标表的子表单组件数据

* 使用的表单

* 需求

「风险类型」表单，维护着风险类型和该类型下有哪些风险事件的数据。「风险事件」表单记录的是每个风险事件的详情。

* 公式配置详情&公式解析

<Frame>
  ![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1612083701053-b17b66fe-8110-4acf-af68-b3347feced7e.png)
</Frame>

**公式配置解析：**

<Frame>
  ![](https://yida-support.oss-cn-shanghai.aliyuncs.com/static/png/1612083711904-74d16a02-5e97-4c89-a38b-97fb9a1e6081.png)
</Frame>

**公式配置解析**

## 注意事项

* 不能既更新普通组件，又要更新明细下的值。如果有这种场景，请分成两个 UPSERT 函数，一个用来更新普通组件，一个用来更新明细下的数据。
* 在上面讲解的商品进货存货的场景中，其实当表单数据删除时，是需要把存货量扣除的，此时可以在「表单删除」上，配置 UPDATE 函数，用于扣除数据，从而保证数据是一致的。
* UPSERT 函数一次最多只能 更新 100 条主表单数据 ，超出会报错导致提交失败。 免费版 一次最多只能插入 某条表单数据下 50 个明细数据， 轻享版、专业版 一次 可更新插入 500 条明细数据 （ 默认是50条，需要在表单编辑页面设置最大条数为500条 ） ，超出也会报错提示「提交失败」。
* UPSERT 函数一次只能操作表单下一个明细组件的数据。如果有操作多个明细组件数据的需求，请配置多个UPSERT 函数。
* 主条件和子条件是由逻辑函数构造的。除了 AND 和 OR 之外，其他逻辑函数第一个参数必须是目标表中的组件，两个参数的位置不能调换。
* 配置 UPSERT 函数将明细数据插入(更新)到另一张表，当明细下有两条数据都命中相同的条件时，会是另一张表插入两条数据，而不会是第一条明细数据插入，第二条明细数据更新。
* 高级公式组件支持范围如下
