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で関連付ける - トランザクション:エラー発生時に全体がロールバックされる場合がある

