Zo los je DUPLICATE_EXTERNAL_ID op in Salesforce-deployments

Een upsert matcht meer dan één bestaand record op dezelfde external ID-waarde, waardoor Salesforce niet kan bepalen welke moet worden bijgewerkt.

Verschijnt tijdens: upsert-DML bij data loads, integraties en Apex

Wat het betekent

DUPLICATE_EXTERNAL_ID betekent dat een upsert-aanroep meer dan één record in de doel-org vond met dezelfde waarde in het external ID-veld waarop wordt gematcht. Upsert vertrouwt erop dat dat veld per record echt uniek is; als er duplicaten bestaan, heeft Salesforce geen manier om te bepalen welk record de binnenkomende data moet bijwerken, dus wijst het de operatie af in plaats van te gokken.

Dit is puur een probleem met de datastatus in de doel-org, niet iets dat mis is met de binnenkomende payload zelf; dezelfde upsert-aanroep zou slagen zodra de duplicaatwaarden in de doel-org zijn opgelost.

Diagnose

Veelvoorkomende oorzaken

External ID-veld werd nooit als uniek gemarkeerd
Het attribuut "Unique" van het veld werd bij het aanmaken niet ingeschakeld, waardoor niets het invoegen van duplicaatwaarden na verloop van tijd tegenhield.
Migratie liep voordat brondata werd gededupliceerd
Een data load voegde duplicaat external ID-waarden in voordat iemand controleerde of de doel-org al records met dezelfde waarden bevatte.
Samengevoegde systemen kenden dezelfde sleutel twee keer toe
Twee bronsystemen genereerden onafhankelijk van elkaar dezelfde external ID-waarde voor verschillende records, en beide kwamen in dezelfde org terecht.

De oplossing

  1. Dedupliceer eerst records die de external ID delen
    Bevraag de doel-org op de probleemwaarde, bepaal welk record leidend is, en voeg de rest samen of verwijder deze voordat je het opnieuw probeert.
    SELECT External_Id__c, COUNT(Id)
    FROM Account
    GROUP BY External_Id__c
    HAVING COUNT(Id) > 1
  2. Schakel het attribuut Unique in op het veld
    Bewerk de definitie van het external ID-veld zodat Salesforce uniciteit vanaf nu afdwingt en nieuwe duplicaten blokkeert bij het invoegen.
  3. Gebruik een specifiekere samengestelde sleutel
    Als twee legitiem verschillende records dezelfde basiswaarde kunnen delen, combineer deze dan met een tweede veld zodat de match ondubbelzinnig is.
In de praktijk

Hoe Serpent dit voorkomt

Serpent houdt elke sandbox en scratch org gesynchroniseerd vanuit dezelfde bron, waardoor duplicaat external ID-waarden uit verouderde, handmatig geladen data veel minder snel tussen omgevingen opstapelen. Bekijk de bibliotheek met Salesforce-deploymentfouten.

Metadata en data in één deploymentflow in Serpent

Preventie

Markeer integratie-ID-velden altijd als Unique en External ID
Stel beide attributen in op het moment dat het veld wordt aangemaakt, voordat een data load de kans krijgt om een niet-afgedwongen duplicaat in te voegen.
Dedupliceer bij het bronsysteem, niet na de load
Dwing uniciteit af op de external key in het systeem dat deze genereert, zodat Salesforce een schone waardenstroom ontvangt in plaats van het probleem downstream op te vangen.
Voer periodiek een duplicaatscan uit op external ID-velden
Plan een terugkerend rapport of query in dat elke external ID-waarde signaleert die door meer dan één record wordt gedeeld, zodat afwijkingen worden opgemerkt voordat de volgende integratiesync mislukt.
Veelgestelde vragen

DUPLICATE_EXTERNAL_ID, uitgelegd

Betekent DUPLICATE_EXTERNAL_ID dat mijn data corrupt is?
Niet noodzakelijk. Het betekent meestal alleen dat dezelfde external ID-waarde de org tweemaal bereikte vanuit aparte loads of systemen, niet dat er verder iets mis is met de records.
Lost het achteraf markeren van het veld als Unique bestaande duplicaten met terugwerkende kracht op?
Nee. Salesforce staat niet toe dat je het attribuut Unique inschakelt terwijl er al duplicaatwaarden bestaan; je moet de duplicaten eerst oplossen en daarna de beperking toepassen.
Gebeurt dit zowel bij standaard upsert als bij Bulk API upsert-jobs?
Ja. Zowel de standaard upsert()-DML-aanroep als Bulk API upsert-jobs handhaven dezelfde uniciteitseis op het external ID-veld waarop wordt gematcht.

Start gratis. Geen creditcard, geen installatie, geen verplichting.

Binnen 15 minuten ingesteld. Geen DevOps-aanwerving nodig.

Benieuwd naar sneller releasen voordat je instapt? Laten we praten

Vrijblijvend.