insert, update, delete, upsert
Las cuatro operaciones de Data Loader, escritas en una línea de Apex. Qué necesita cada una, qué pasa por dentro al guardar y por qué siempre trabajan mejor con listas.
✓ En esta sub-lección
- 01Crear, modificar, borrar y recuperar registros con insert, update, delete y undelete.
- 02Usar upsert con un campo de Id externo para crear o actualizar según exista.
- 03Explicar qué dispara un DML: reglas de validación, flows y triggers.
La nutria: ¿Te acuerdas? · Repaso del Módulo 3
Tienes los Ids de 200 cuentas en un Set. ¿Cómo las traes de la base de datos?
En el Módulo 3 aprendiste a leer la base de datos. Todo lo que has construido hasta ahora (objetos con new, campos cambiados, listas preparadas) vive solo en memoria y desaparece al terminar la . Para que algo se guarde de verdad hace falta : las instrucciones que escriben en la base de datos.
La nutria: El paralelo de Admin
insert new Account(Name = 'Nimbus Logistics');
Data Loader → Insert, sin columna Id
Necesita: Ningún Id: te lo da Salesforce
| Id | Name | Rating |
|---|---|---|
| 001…A1 | Acme | Hot |
| 001…B2 | Globex | Warm |
Así está la org antes. Pulsa Ejecutar.
insert: crear
Account acc = new Account(Name = 'Nimbus Logistics', Industry = 'Transportation');
System.debug(acc.Id); // null: todavía no existe en la base de datos
insert acc;
System.debug(acc.Id); // 001...: Salesforce le ha dado un IdList<Contact> contacts = new List<Contact>{
new Contact(LastName = 'Ortega', AccountId = acc.Id),
new Contact(LastName = 'Lindqvist', AccountId = acc.Id)
};
insert contacts; // una sola instrucción para toda la listaupdate: cambiar
update necesita el Id, igual que en Data Loader, porque así sabe qué registro cambiar. Lo habitual es consultar, modificar en memoria y actualizar. Pero si ya tienes el Id y solo quieres cambiar un campo, no hace falta consultar: basta un sObject con el Id y el campo, como un CSV de Data Loader con solo dos columnas.
// Consultar → modificar → actualizar
List<Account> cold = [SELECT Id, Rating FROM Account WHERE Rating = 'Cold' AND Industry = 'Retail'];
for (Account a : cold) {
a.Rating = 'Warm';
}
update cold;
// Sin consultar: solo el Id y lo que cambia
update new Account(Id = acc.Id, Rating = 'Hot');delete y undelete: la Papelera
List<Lead> junk = [SELECT Id FROM Lead WHERE Email = null AND CreatedDate < LAST_N_DAYS:365];
delete junk; // van a la Papelera, como al borrar desde la interfaz
// Recuperar: ALL ROWS hace que la consulta vea también lo borrado
List<Lead> back = [SELECT Id FROM Lead WHERE IsDeleted = true AND LastName = 'Ortega' ALL ROWS];
undelete back;upsert: crear o actualizar
Cuando cargas datos que vienen de otro sistema (un ERP, una tienda online) no sabes si cada cliente ya existe en Salesforce. En Data Loader usas Upsert con un campo marcado como : si el valor ya está, actualiza; si no, crea. En Apex es igual, indicando ese campo detrás de la lista.
// ERP_Id__c es un campo de texto marcado como External ID
List<Account> fromErp = new List<Account>{
new Account(ERP_Id__c = 'C-1001', Name = 'Nimbus Logistics'),
new Account(ERP_Id__c = 'C-2040', Name = 'Aurora Foods')
};
upsert fromErp Account.Fields.ERP_Id__c;Tu código pasa por las mismas reglas que un usuario
Un insert desde Apex no es una puerta trasera. El registro recorre el mismo guardado que cuando alguien pulsa Guardar en la pantalla: se ejecutan tus reglas de validación, tus flows desencadenados por registro y los triggers del objeto (Módulo 6). Si una regla de validación rechaza el registro, el insert lanza una DmlException con el mismo mensaje que vería el usuario. Tu código no se salta la configuración de la org: convive con ella.
La nutria: El «obligatorio» del formato de página no te protege aquí
El encargo de este módulo
La nutria: Las seis piezas de la operación diaria
La nutria: ¿Y por qué no un Flow? Para dar de alta un cliente, sí