Scenario: Write Trigger on Contact to prevent inserting or updating duplicate Contacts. Use Email field to compare with existing Contacts record.
ContactTrigger
trigger ContactTrigger on Contact (before insert, before update) {
if(trigger.isBefore && trigger.isInsert || trigger.isUpdate) {
ContactTriggerHandler.checkDuplicateEmail(trigger.new);
}
}
ContactTriggerHandler Approach 1
public class ContactTriggerHandler {
public static void checkDuplicateEmail(List<Contact> conLst) {
// What we have handled - allow to insert contact with null/empty email
Set<String> setEmail = new Set<String>();
Map<String,Id> mapExistingEmailtoCon = new Map<String,Id>();
for(Contact con : conLst){
if(con.Email != null || con.Email != ''){
setEmail.add(con.Email.toLowerCase());
}
}
for(Contact cont : [Select Id , Email from Contact where Email In: setEmail]){
mapExistingEmailtoCon.put(cont.Email.toLowerCase(), cont.Id);
}
System.debug(mapExistingEmailtoCon);
for(Contact con : conLst){
if(con.Email!= null && mapExistingEmailtoCon.containsKey(con.Email.toLowerCase())){
con.addError('Contact with same email already exist');
}
}
}
}
ContactTriggerHandler Approach 2
public class ContactTriggerHandler {
public static void checkDuplicateEmailOnInsert(List<Contact> conLst) {
// Approach 2 - This will hit limit
// What we have handled - allow to insert contact with null/empty email
// Problems:Here limit will be hit Solution
List<Contact> existingContacts = [Select Email From Contact];
List<String> emailsLst = new List<String>();
for(Contact con: existingContacts) {
emailsLst.add(con.Email);
}
for(Contact con: conLst) {
if(con.Email != null && con.Email != '' && emailsLst.contains(con.Email)){
con.AddError('Contact with same email already exist');
}
}
}
}