So beheben Sie DUPLICATE_EXTERNAL_ID in Salesforce-Deployments

Ein Upsert trifft auf mehr als einen bestehenden Datensatz mit demselben Wert der externen ID, sodass Salesforce nicht weiß, welcher aktualisiert werden soll.

Tritt auf bei: Upsert-DML bei Datenladevorgängen, Integrationen und in Apex

Was das bedeutet

DUPLICATE_EXTERNAL_ID bedeutet, dass ein Upsert-Aufruf mehr als einen Datensatz in der Ziel-Org gefunden hat, der denselben Wert im abgeglichenen Feld der externen ID teilt. Upsert setzt voraus, dass dieses Feld pro Datensatz wirklich eindeutig ist; existieren Duplikate, hat Salesforce keine Möglichkeit zu entscheiden, welcher Datensatz durch die eingehenden Daten aktualisiert werden soll, und lehnt die Operation daher ab, statt zu raten.

Dies ist rein ein Datenzustandsproblem in der Ziel-Org, kein Fehler in der eingehenden Payload selbst; derselbe Upsert-Aufruf würde erfolgreich sein, sobald die Duplikatwerte in der Ziel-Org bereinigt sind.

Diagnose

Häufige Ursachen

Feld der externen ID wurde nie als eindeutig markiert
Das Attribut „Unique“ des Feldes wurde bei dessen Erstellung nicht aktiviert, sodass nichts das Einfügen doppelter Werte im Laufe der Zeit verhinderte.
Migration lief, bevor die Quelldaten dedupliziert wurden
Ein Datenladevorgang fügte doppelte Werte der externen ID ein, bevor jemand prüfte, ob die Ziel-Org bereits Datensätze mit denselben Werten enthielt.
Zusammengeführte Systeme vergaben denselben Schlüssel zweimal
Zwei Quellsysteme erzeugten unabhängig voneinander denselben Wert der externen ID für unterschiedliche Datensätze, und beide landeten in derselben Org.

Die Lösung

  1. Datensätze mit derselben externen ID zuerst deduplizieren
    Fragen Sie die Ziel-Org nach dem betreffenden Wert ab, entscheiden Sie, welcher Datensatz maßgeblich ist, und führen Sie den Rest zusammen oder löschen Sie ihn, bevor Sie es erneut versuchen.
    SELECT External_Id__c, COUNT(Id)
    FROM Account
    GROUP BY External_Id__c
    HAVING COUNT(Id) > 1
  2. Aktivieren Sie das Attribut „Unique“ für das Feld
    Bearbeiten Sie die Definition des Felds der externen ID, damit Salesforce künftig Eindeutigkeit erzwingt und neue Duplikate beim Einfügen blockiert.
  3. Einen spezifischeren zusammengesetzten Schlüssel verwenden
    Wenn zwei tatsächlich unterschiedliche Datensätze denselben Basiswert teilen können, kombinieren Sie ihn mit einem zweiten Feld, damit der Abgleich eindeutig ist.
In der Praxis

Wie Serpent das verhindert

Serpent hält jede Sandbox und Scratch Org mit derselben Quelle synchron, sodass sich doppelte Werte externer IDs aus veralteten, manuell geladenen Daten zwischen Umgebungen deutlich seltener ansammeln. Siehe die Bibliothek der Salesforce-Deployment-Fehler.

Metadaten und Daten in einem einzigen Deployment-Flow in Serpent

Prävention

Integrationsbezogene ID-Felder immer als Unique und External ID markieren
Setzen Sie beide Attribute in dem Moment, in dem das Feld erstellt wird, bevor ein Datenladevorgang die Chance hat, ein nicht erzwungenes Duplikat einzufügen.
Deduplizieren Sie im Quellsystem, nicht nach dem Ladevorgang
Erzwingen Sie Eindeutigkeit für den externen Schlüssel in dem System, das ihn erzeugt, damit Salesforce einen sauberen Wertestrom erhält, statt das Problem nachgelagert abzufangen.
Regelmäßigen Duplikat-Scan für Felder der externen ID durchführen
Planen Sie einen wiederkehrenden Bericht oder eine Abfrage, die jeden von mehreren Datensätzen geteilten Wert der externen ID meldet, damit Abweichungen erkannt werden, bevor die nächste Integrationssynchronisierung fehlschlägt.
Häufige Fragen

DUPLICATE_EXTERNAL_ID, erklärt

Bedeutet DUPLICATE_EXTERNAL_ID, dass meine Daten beschädigt sind?
Nicht unbedingt. Es bedeutet meist nur, dass derselbe Wert der externen ID die Org zweimal über separate Ladevorgänge oder Systeme erreicht hat, nicht dass sonst etwas mit den Datensätzen nicht stimmt.
Behebt eine nachträgliche Markierung des Felds als Unique bestehende Duplikate rückwirkend?
Nein. Salesforce lässt Sie das Attribut Unique nicht aktivieren, solange bereits doppelte Werte existieren; Sie müssen die Duplikate zuerst auflösen und dann die Einschränkung anwenden.
Passiert das sowohl beim Standard-Upsert als auch bei Bulk-API-Upsert-Jobs?
Ja. Sowohl der Standard-DML-Aufruf upsert() als auch Bulk-API-Upsert-Jobs erzwingen dieselbe Eindeutigkeitsanforderung für das abgeglichene Feld der externen ID.

Kostenlos starten. Keine Kreditkarte, keine Installation, keine Verpflichtung.

In unter 15 Minuten eingerichtet. Keine DevOps-Einstellung nötig.

Neugierig auf schnelleres Shipping, bevor Sie einsteigen? Sprechen wir

Unverbindlich.