I have a custom object, with a Text Name (ID) field. When I upsert two records with identical Name/ID, but otherwise different values, in two separate upsert statement, one record results, as expected.
When I create a list, add these records to the list, and then upsert the list, I get a
DUPLICATE_VALUE error. What gives? By definition, upsert should not do this, should it?
Even worse: it doesn't matter whether a record with the identical Name already exists or not, the upsert will fail in both scenarios.
By the way: by default
upsert a does not use the Name/ID field as identifying/unique field, as you might expect. You need to do
upsert a Name
List<Flight__c> flights = new List<Flight__c>(); Flight__c f1 = new Flight__c(); f1.Name = 'ABC123'; f1.Flight_Number__c = 'ABC'; flights.add(f1); Flight__c f2 = new Flight__c(); f2.Name = 'ABC123'; f2.Flight_Number__c = '123'; flights.add(f2); upsert flights Name;
Error message: Line: 12, Column: 1 System.DmlException: Upsert failed. First exception on row 0; first error: DUPLICATE_VALUE, Duplicate external id specified: ABC123: [Name]
Name being the standard identifying field of a custom object. You cannot edit the properties of this field, e.g. making it unique or not unique.