こんにちは。CData Software Japanリードエンジニアの杉本です。
今回は CData Salesforce Driverの知っておくと便利な機能、UPSERT について解説します。
UPSERT とは?
通常 Salesforceのレコードを更新したい場合、事前にレコードのIDを特定する必要があります。
Salesforce の画面上では以下のようにURLで利用されている値で
CData Salesforce Driverでは以下のように取得できる項目です。
このIdを特定した上で、以下のようにUpdateのリクエストを実行できます。
UPDATE Account SET Name = 'Update' WHERE Id = '0010I00002X9bnYQAR';
cdn.cdata.com
しかしながら、外部のRDBからデータを渡したい、みたいな要望がある場合、SalesforceのIdを外部RDB側で保持していない、というケースは多く存在すると思います。
そのため、例えば一度メールアドレスや企業IDなど、外部データとマッチングできる一意のIDでSalesforceのデータを検索し、その結果からSalesforceのIdを特定して、ようやくUpdateを行う、というのが回りくどいアプローチを取らざるを得ません。
ただ、以前にBlogでも紹介したように、SalesforceにはAPI制限があり、レコードの更新のたびにIdを特定しようとすれば、リクエスト数が2倍になってしまうので、簡単にAPI制限を圧迫してしまいます。
www.cdatablog.jp
そこで、活用できるのが、この「UPSERT」の機能です。
このUPSERTを使うことで、Salesforceのオブジェクトに対して、外部で利用している一意のIDを指定し、そのIDが存在すれば更新、存在しなければ追加といった処理を行うことができるようになります!
developer.salesforce.com
cdn.cdata.com
リクエストも一回で済むので、API リクエストの節約にも繋がりますね!
それでは、そんな便利なUPSERTの使い方を解説していきたいと思います。
オブジェクトに外部IDを準備する
まず、Upsert機能を利用するために必要となる外部IDの項目を準備しましょう。
今回は取引先(Account)オブジェクトに外部IDの項目を用意します。
「項目とリレーション」のカスタマイズページに移動して「新規」をクリックし
新しく「テキスト」の項目を追加します。
続いて、項目の設定を行うのですが、ここで重要なのが「外部ID:外部システムの一意のレコード識別子として設定する」のプロパティにチェックを入れることです。
ここで、この項目をUPSERTを行うための外部IDとして利用することができるようになります。
あとは、任意の設定で作成を進めて構いません。
最終的に以下のように項目が追加されました。
UPSERT 文を実行する
それでは、実際に CData Salesforce Driverを使って、UPSERT を試してみましょう。
今回は、CData Salesforce JDBC Driverを利用しました。
www.cdata.com
SQLを実行するツールとして、DBVisualizer を使用しています。
www.cdata.com
早速、DBVisualizer からSalesforceに接続してみると、以下のようにAccountテーブルに追加した項目である「CDataExternalId__c」が追加されていることが確認できます。
データを取得してみると、以下のような状態になっています。
SELECT Id,Name,AccountNumber,CDataExternalId__c FROM Account;
それでは、UPSERTを試してみます。UPSERTの構文は以下のようになります。AccountのName、AccountNumber、そしてCDataExternalId__cを入力する構成としました。
UPSERT INTO Account(Name,AccountNumber,CDataExternalId__c,ExternalIdColumn)
VALUES('UPSERT TEST INSERT','001','UPSERTKEY01','CDataExternalId__c');
cdn.cdata.com
ここでのポイントは外部IDとなる項目を「ExternalIdColumn」という項目で指定することです。
今回は外部IDが「CDataExternalIdc」という項目なので、これをExternalIdColumnの値として指定します。これにより、この項目を一意の判定材料として利用し、CDataExternalIdcに指定した値がSalesforce上に存在すれば更新を行い、存在しなければ追加を行います。
実際に試してみると、以下のようにデータが追加されました。
それでは、再度同じ「CDataExternalId__c」の値でNameの値だけ変更したUPSERTを実行してみましょう。
UPSERT INTO Account(Name,AccountNumber,CDataExternalId__c,ExternalIdColumn)
VALUES('UPSERT TEST ★UPDATE★','001','UPSERTKEY01','CDataExternalId__c');
結果は以下の通りとなり、レコードが追加されず、先程追加したレコードが更新されました。
おわりに
このように、UPSERTは知っておくととても便利な機能です。
外にも様々な便利機能が存在するので、是非ドキュメントを参照してみてください。
cdn.cdata.com
もし、気になる機能やわからないことがあれば、テクニカルサポートまで気軽に質問してみてください。
https://www.cdata.com/jp/support/submit.aspx
関連コンテンツ