> ## 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 - 挿入または更新

> YiDAのUPSERT()関数の使い方を解説。フォーマット・パラメータ・具体的な事例を通じて、ターゲットフォームへのデータ挿入と更新を1つの関数で実現する方法を紹介します。

UPSERT()関数は、ターゲットフォームへデータを挿入または更新するために使用します。データを挿入する際、対象データがターゲットフォームにすでに存在する場合は更新を行い、存在しない場合は挿入を行います。

## フォーマット

`UPSERT()`関数のフォーマットは次のとおりです。

```javascript theme={"theme":{"light":"github-light","dark":"github-dark"}}
UPSERT (Target Table, Main Condition, Sub Condition, Target Column 1, Target Value 1, Target Column 2, Target Value 2......)
```

* Target Table: データを挿入・更新するターゲットフォームです。

* Main Condition: メイン条件は、どのレコードを更新するかを特定するために使用します。メイン条件は論理関数で構成されます。

* Sub Condition:

* Target Column:

* Target Value: Target Columnを更新する値を指します。Target Valueには、現在のエントリフォームのコンポーネント値、更新対象となるターゲットフォームのコンポーネント値、固定値、または他の関数で構成された値を指定できます。

## ケース1: ベーシックコンポーネントのデータを挿入する際に、ターゲットフォームのベーシックコンポーネントのデータを更新する

* 使用するフォーム

* 要件

購買フォームに商品を登録する際、在庫フォームに同じ商品名のデータが存在する場合は、その商品の既存在庫数量に購買数量を加算します。在庫フォームに商品名が見つからない場合は、商品名を在庫フォームに挿入し、在庫数量を購買数量と等しく設定します。

* 数式の設定詳細と数式の解説

**数式の解説:**

* Target Table: 在庫テーブル。
* Main Condition: EQ(在庫テーブル.商品名, 商品名)。更新対象のレコードは、在庫テーブル内で商品名がエントリフォームで入力された商品名と等しいものです。
* Sub Condition: 「在庫テーブル」で更新されるのはベーシックコンポーネントである商品名と在庫数量であり、明細が関わらないため、Sub Conditionには「」を入力します。
* Target Column: 在庫テーブル.商品名。
* Target Value: 商品名。データが見つからない場合、データを挿入する際、在庫テーブルの商品名の値は購買テーブルの商品名の値となります。
* Target Column: 在庫テーブル.在庫数量
* Target Value: 在庫テーブル.在庫数量 + 購買数量。条件に基づいて在庫商品をマッチングした後、今回の購買数量を元の在庫数量に加算します。

## ケース2: サブフォームコンポーネントのデータを挿入する際に、ターゲットフォームのベーシックコンポーネントのデータを更新する

* 使用するフォーム

* 要件

購買テーブルには購買明細があり、一度に複数の商品を登録できます。登録された複数の商品について、在庫テーブルで対応する商品が見つからない場合（商品名と商品カテゴリの両方が一致する場合に同じ商品とみなします）、データを挿入します。対応する商品が見つかった場合は、該当商品の在庫数量を更新します（在庫数量 = 元の在庫数量 + 購買数量）。

* 数式の設定詳細と数式の解説

## ケース3: ベーシックコンポーネントのデータを挿入する際に、ターゲットフォームのサブフォームコンポーネントのデータを更新する

* 使用するフォーム

* 要件

「リスクタイプ」フォームでは、リスクタイプおよび各タイプに属するリスク予定のデータを管理します。「リスク予定」フォームでは、各リスク予定の詳細を記録します。

* 数式の設定詳細と数式の解説

**数式の設定解説:**

**数式の設定解説**

## 注意事項

* ベーシックコンポーネントと明細下の値を同時に更新することはできません。このようなシナリオがある場合は、2つのUPSERT関数に分割してください。1つはベーシックコンポーネントの更新用、もう1つは明細下のデータの更新用として使用します。
* 上記で説明した商品購買・在庫のシナリオでは、フォームデータが削除された場合、在庫数量も相応に減算する必要があります。この場合、「フォーム削除」イベントにUPDATE関数を設定してデータを減算し、データの整合性を確保できます。
* UPSERT関数は一度に最大100件のメインフォームデータのレコードを更新できます。これを超えるとエラーとなり、送信に失敗します。Freeプランでは、一度に特定のフォームデータの下に最大50件の明細データエントリを挿入できます。ベーシック版およびプロフェッショナル版では、一度に500件の明細データエントリを更新・挿入できます（デフォルトは50件です。最大件数を500に設定するには、フォーム編集ページで設定する必要があります）。これを超えた場合もエラーとなり、「送信に失敗しました」と表示されます。
* UPSERT関数は一度に1つのフォーム下の1つの明細コンポーネントのデータのみを操作できます。複数の明細コンポーネントのデータを操作する必要がある場合は、複数のUPSERT関数を設定してください。
* Main ConditionとSub Conditionは論理関数で構成されます。ANDとOR以外の論理関数では、第1パラメータはターゲットテーブルのコンポーネントでなければならず、2つのパラメータの位置を入れ替えることはできません。
* UPSERT関数を設定して明細データを別のテーブルに挿入（更新）する際、明細下の2つのレコードが同じ条件に該当する場合、別のテーブルには2つのレコードが挿入されます。1つ目の明細レコードが挿入され、2つ目の明細レコードが更新されるわけではありません。
* プレミアム数式コンポーネントの対応スコープは以下のとおりです
