Search code examples
triggersduplicatessalesforceapex-codebulk

Prevent duplicate values on bulk insert (Salesforce)


I need a trigger that receives data from users (Bulk load of about 1000 records) and store them in a Salesforce database. The problem is that users can show up more than once in Trigger.new or even on a different batch. The custom object name is CBK_User and has an EXTERNAL_ID (unique) called USER_ID. In my code I check that the users does not yet exist in the database:

Map<String, CBK_User__c> users = new Map<String,CBK_User__c> 
    ([select Id, USER_ID__c from CBK_User__c where USER_ID__c in : userIds]);

(userIds has the external ids of the Trigger.new objects)

When a I try to insert, it gives me the error:

DUPLICATE_VALUE, duplicate value found: USER_ID__c duplicates value on 
record with id: a1QJ0000000HRd8"

How do I prevent duplicate values on bulk insert?


Solution

  • I've adapted your problem to this basic example (Exercise 2: Lead duplicate prevention)

    You should clean first the "new" list from duplicated entries, and then clean from existing in db.

         trigger CBK_UserDuplicatePreventer on CBK_User__c (before insert, before update) {
            //Enter a map declaration to hold records which we will add,
            // this will become a unique map, no duplicate values within it.
            Map<String, CBK_User__c> cbkUserMap = new Map<String, CBK_User__c>();
    
            //The next few lines loop across the array of records that are passed into 
            //the trigger in bulk fashion from any API or User Interface database operation.
            //The goal of this loop is to ensure that there are no duplicates within 
            //the batch that we have received and to gather a list of externalIds that we will use later
            for (CBK_User__c cbkUser : System.Trigger.new) {
    
                /* Make sure we don't treat an externalId that
                   isn't changing during an update as a duplicate. */
                if ((cbkUser.USER_ID__c != null) && (System.Trigger.isInsert ||
     (cbkUser.USER_ID__c != System.Trigger.oldMap.get(cbkUser.Id).USER_ID__c))) {
    
                    // Make sure another new CBK_User__c isn't also a duplicate
                    if (cbkUserMap.containsKey(cbkUser.USER_ID__c)) {
                        cbkUser.USER_ID__c.addError('Another new CBK_User__c has the same USER_ID.');
                    } else {
                        cbkUserMap.put(cbkUser.USER_ID__c, cbkUser);
                    }
                }
            }
    
            // Using a single database query, find all the CBK_User__c in
            // the database that have the same USER_ID as ANY
            // of the CBK_User__c being inserted or updated. */
            for (CBK_User__c cbkUser : [SELECT USER_ID__c FROM CBK_User__c WHERE USER_ID__c IN :cbkUserMap.KeySet()]) {
                CBK_User__c newCbkUser = cbkUserMap.get(cbkUser.USER_ID__c);
                newCbkUser.USER_ID__c.addError('A CBK_User__c with this USER_ID already exists.');
            }
        }