Comment corriger DUPLICATE_EXTERNAL_ID dans les déploiements Salesforce

Un upsert correspond à plusieurs enregistrements existants ayant la même valeur d'ID externe, donc Salesforce ne peut pas déterminer lequel mettre à jour.

Apparaît pendant : le DML upsert lors des chargements de données, des intégrations et dans Apex

Ce que cela signifie

DUPLICATE_EXTERNAL_ID signifie qu'un appel upsert a trouvé plusieurs enregistrements dans l'org cible partageant la même valeur dans le champ d'ID externe utilisé pour la correspondance. L'upsert repose sur l'unicité réelle de ce champ par enregistrement ; en présence de doublons, Salesforce n'a aucun moyen de décider quel enregistrement les données entrantes doivent mettre à jour, donc il rejette l'opération plutôt que de deviner.

Il s'agit purement d'un problème d'état des données dans l'org cible, pas d'un défaut de la charge utile entrante elle-même ; le même appel upsert réussirait dès que les valeurs dupliquées de l'org cible seraient résolues.

Diagnostic

Causes courantes

Le champ d'ID externe n'a jamais été marqué comme unique
L'attribut « Unique » du champ n'a pas été activé lors de sa création, donc rien n'a empêché l'insertion de valeurs dupliquées au fil du temps.
La migration s'est exécutée avant la déduplication des données source
Un chargement de données a inséré des valeurs d'ID externe dupliquées avant que quiconque ne vérifie que l'org cible contenait déjà des enregistrements avec ces mêmes valeurs.
Des systèmes fusionnés ont attribué la même clé deux fois
Deux systèmes source ont généré indépendamment la même valeur d'ID externe pour des enregistrements différents, et les deux ont atterri dans la même org.

La solution

  1. Dédupliquez d'abord les enregistrements partageant l'ID externe
    Interrogez l'org cible pour trouver la valeur en cause, déterminez quel enregistrement fait autorité, et fusionnez ou supprimez le reste avant de réessayer.
    SELECT External_Id__c, COUNT(Id)
    FROM Account
    GROUP BY External_Id__c
    HAVING COUNT(Id) > 1
  2. Activez l'attribut Unique sur le champ
    Modifiez la définition du champ d'ID externe afin que Salesforce applique l'unicité à l'avenir et bloque les nouveaux doublons à l'insertion.
  3. Utilisez une clé composite plus spécifique
    Si deux enregistrements légitimement différents peuvent partager la valeur de base, combinez-la avec un second champ afin que la correspondance soit sans ambiguïté.
En pratique

Comment Serpent évite cela

Serpent maintient chaque sandbox et scratch org synchronisé depuis la même source, ce qui rend beaucoup moins probable l'accumulation de valeurs d'ID externe dupliquées issues de données obsolètes chargées manuellement entre les environnements. Consultez la bibliothèque des erreurs de déploiement Salesforce.

Métadonnées et données dans un seul flux de déploiement dans Serpent

Prévention

Marquez toujours les champs d'ID destinés à l'intégration comme Unique et External ID
Définissez les deux attributs dès la création du champ, avant qu'un chargement de données ait la moindre chance d'insérer un doublon non contraint.
Dédupliquez au niveau du système source, pas après le chargement
Appliquez l'unicité sur la clé externe dans le système qui la génère, afin que Salesforce reçoive un flux de valeurs propre au lieu de détecter le problème en aval.
Effectuez une analyse périodique des doublons sur les champs d'ID externe
Planifiez un rapport ou une requête récurrente qui signale toute valeur d'ID externe partagée par plusieurs enregistrements, afin de détecter la dérive avant l'échec de la prochaine synchronisation d'intégration.
Questions fréquentes

DUPLICATE_EXTERNAL_ID, expliqué

DUPLICATE_EXTERNAL_ID signifie-t-il que mes données sont corrompues ?
Pas nécessairement. Cela signifie généralement juste que la même valeur d'ID externe a atteint l'org deux fois via des chargements ou systèmes séparés, pas qu'autre chose ne va pas avec les enregistrements.
Marquer le champ comme Unique après coup corrige-t-il rétroactivement les doublons existants ?
Non. Salesforce ne vous laissera pas activer l'attribut Unique tant que des valeurs dupliquées existent déjà ; vous devez d'abord résoudre les doublons, puis appliquer la contrainte.
Cela se produit-il avec l'upsert standard ainsi qu'avec les jobs upsert de l'API Bulk ?
Oui. L'appel DML standard upsert() et les jobs upsert de l'API Bulk appliquent tous deux la même exigence d'unicité sur le champ d'ID externe utilisé pour la correspondance.

Commencez gratuitement. Sans carte bancaire, sans installation, sans engagement.

Configuration en moins de 15 minutes. Aucune embauche DevOps nécessaire.

Curieux de livrer plus vite avant de vous lancer ? Parlons-en

Sans engagement.