
はじめに ~UPSERTとは~
SQL のUPSERT 文はデータベース操作の一つで、レコードが存在しない場合は挿入(INSERT)し、存在する場合は更新(UPDATE)する便利な機能を持ちます。例えば、レコードの更新時に当該レコードの存在有無を事前に確認し、存在する場合はUPDATE、存在しない場合はINSERT といった一連の処理を行いたいとき、従来は条件分岐によって2つの操作を使い分けていましたが、UPSERT 文を使うことでこの処理を1つの文で済ませることができます。これにより開発効率の向上やエラーの現象など様々なメリットがあります。
以下のように3つの商品レコードを持つProducts テーブルを例に説明します。このテーブルでは「キー」カラムの値でレコードの照合を行います。

以下のようにキーが存在しないレコードがUPSERT されたときはそのレコードを挿入します。

以下のようにキーが存在するレコードがUPSERTされたときはレコードの更新を行います。

NetSuiteのUPSERT文
CData NetSuite Drivers はUPSERT 文をサポートしています。NetSuite はアクセスするAPI の違いによりSuiteTalkスキーマとSuiteQLスキーマの2つのスキーマがありますが、データの更新はSuiteTalk スキーマで対応しており、UPSERT もSuiteTalk スキーマでのみ使用できます。
NetSuiteのUPSERT文の書式は以下の通りです。
UPSERT INTO Table(Column1, Column2, ... , ExternalId) values(更新値1, 更新値2, ... ,外部キー値);
Column1, Column2, ... は更新するカラム、ExternalId はUPSERT のキーとなる「外部キー」を指定するカラムです。NetSuite のSuiteTalk スキーマではすべてのテーブルにExternalId カラムが存在します。
以下に取引先テーブルに対してUPSERT 文を実行し取引先名を更新(または挿入)するSQL の例を示します。
UPSERT INTO Account(AcctName, ExternalId) VALUES('New Customer Name','key1');
INSERT文でUPSERTを実行する
ドライバでUPSERT 文をサポートしていても、ツールによってはINSERT やUPSERT など典型的な文以外のSQL を実行できない場合があります。その際はUseUpsertsプロパティをTrue に設定することで、INSERT 文でUPSERT を実行できるようになります。
例えばUseUpserts=True を設定し以下のSQL を実行すると、前に示したUPSERT 文と同じ処理が実行されます。
INSERT INTO Account(AcctName, ExternalId) VALUES('New Customer Name','key1');
おわりに
本記事では、NetSuite ドライバでレコードの挿入と更新を1つの文で実行するUPSERT 文を使う方法と、INSERT 文でUPSERT 処理を代替する方法を説明しました。データの更新処理を構築する際はUPSERT を使うことで生産性が大きく上がります。NetSuiteドライバは30日間無料で試用できます。NetSuite との連携をご検討の方はぜひお試しください。
関連コンテンツ