Salesforce DMLとは?

DMLは Data Manipulation Language の略で、Salesforceのレコードを作成・更新・削除・復元するために使用するApexの命令です。

例えば、新しいAccountレコードを作成できます。

Account acct = new Account(Name = 'Acme');
insert acct;

insertを実行すると、レコードがSalesforceに保存され、IDが自動的に割り当てられます。

System.debug(acct.Id);

主なDML文

DML文機能
insert新しいレコードを作成
update既存のレコードを更新
upsertレコードがあれば更新、なければ作成
deleteレコードを削除
undelete削除したレコードを復元
merge重複レコードを統合

レコードの作成・更新

新しいレコードを作成する場合はinsertを使用します。

Account acct = new Account(Name = 'Acme');
insert acct;

既存のレコードを更新する場合はupdateを使用します。

acct.Name = 'New Acme';
update acct;

レコードの削除・復元

レコードを削除する場合はdeleteを使用します。

delete acct;

削除したレコードは通常ごみ箱に移動し、undeleteで復元できます。

undelete acct;

一括DML

DMLは、単一のレコードだけでなく、複数のレコードをListにまとめて処理できます。

List<Account> accounts = new List<Account>{
    new Account(Name='A'),
    new Account(Name='B'),
    new Account(Name='C')
};

insert accounts;

List全体を一度に保存すると、DML文は1回の実行としてカウントされます。

ApexにはDML実行回数の制限があるため、ループ内で1件ずつ保存する処理は避けます。

悪い方法 → ループ内で1件ずつ保存
良い方法 → Listにまとめて一度に保存

upsert

upsertはinsertとupdateを組み合わせた命令です。

upsert accounts;

基本的にはレコードのIdを使って判定します。

Idがある   → 既存レコードを更新
Idがない   → 新しいレコードを作成

外部IDなどを使って既存レコードを判定することもできます。

Databaseメソッド

DML文の代わりにDatabaseクラスのメソッドを使用することもできます。

Database.insert();
Database.update();
Database.upsert();
Database.delete();
Database.undelete();

通常のDML文では、1件でもエラーが発生すると、そのDML処理全体が失敗します。

insert accounts;

一部のレコードだけを保存したい場合は、falseを指定します。

Database.insert(accounts, false);
方法動作
insert accounts全件成功または全件失敗
Database.insert(accounts, false)成功したレコードのみ保存可能

関連レコードの作成

AccountとContactを関連付ける場合は、AccountIdを使用します。

Account acct = new Account(Name='Acme');
insert acct;

Contact con = new Contact(
    LastName='Kim',
    AccountId=acct.Id
);

insert con;

AccountIdにAccountのIDを設定すると、2つのレコードが関連付けられます。

トランザクション

DML処理はトランザクション内で実行されます。

処理中にエラーが発生し、例外が処理されずにトランザクションが失敗すると、それまでの変更もロールバックされます。

Accountの作成に成功
Accountの作成に成功
Contactの更新に失敗
        ↓
トランザクション全体をロールバック

ただし、エラーを適切に処理した場合は、必ずしも全体がロールバックされるわけではありません。

まとめ

  • DML:Salesforceレコードを作成・更新・削除する命令
  • insert:新しいレコードを作成
  • update:既存レコードを更新
  • upsert:レコードがあれば更新、なければ作成
  • delete / undelete:レコードの削除と復元
  • 一括DML:Listにまとめて一度に処理
  • Databaseメソッド:部分的な成功が可能
  • 関連レコード:AccountIdなどのIDで関連付ける
  • トランザクション:エラー発生時に全体がロールバックされる場合がある

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

技術情報

前の記事

sObjectとは