MISE À JOUR SQL vs INSERT vs UPSERT

Cet article examine trois énoncés SQL : MISE À JOUR, INSERTION et UPSERT. Elle comprend des exemples de la manière et du moment où les utiliser.

SQL UPDATE vs. INSERT vs. UPSERT

image_pdfimage_print

Dans n’importe quelle application, vous devez ajouter des enregistrements aux tables de base de données et modifier les informations qu’elles stockent. L’instruction UPDATE SQL modifie les données déjà stockées dans la base de données, et l’instruction INSERT ajoute un nouvel enregistrement à une table. La déclaration UPSERT est une combinaison de INSERT et de UPDATE, qui effectue une mise à jour ou ajoute un enregistrement s’il n’existe pas déjà. Ici, nous allons parler de la MISE À JOUR SQL, de l’INSERT et de l’UPSERT.

Comment utiliser la MISE À JOUR dans SQL : exemples

L’instruction MISE À JOUR met à jour un enregistrement actuel avec les nouvelles informations que vous spécifiez. Par exemple, un client peut déplacer et modifier ses coordonnées dans une table e-commerce, et une déclaration de MISE À JOUR effectuera la modification. Toute modification apportée à une base de données utilisera l’instruction MISE À JOUR.

Il est important de noter que l’optimisation des requêtes réduit la latence de la base de données. Une requête de MISE À JOUR optimisée peut réduire le traitement des données à quelques millisecondes seulement. L’infrastructure est également importante pour une faible latence sur les serveurs de base de données à volume élevé. Pour commencer, utilisez les requêtes suivantes. L’indexation des colonnes fréquemment mises à jour peut contribuer à améliorer les performances. Sur les charges de travail simultanées volumineuses, il peut être nécessaire pour les développeurs de bases de données d’utiliser des niveaux d’isolation pour empêcher les énoncés d’affecter d’autres énoncés également traités.

En revanche, les développeurs et les administrateurs de bases de données doivent gérer les erreurs dans leur code. Ces exemples montrent comment exécuter chaque commande, mais votre logique métier doit déterminer ce qu’il faut faire en cas d’erreur. Par exemple, si la base de données ne parvient pas à insérer un nouveau dossier client, demandez à l’utilisateur de réessayer ou de contacter le service client. La latence, les erreurs et les avertissements d’optimisation des bases de données peuvent être obtenus à l’aide d’outils de surveillance des performances.

MISE À JOUR dans SQL : exemples

Pour la plupart des instructions SQL UPDATE, vous utilisez la clause WHERE. La clause WHERE détermine les dossiers qui seront mis à jour et laisse les autres intacts. Si vous n’utilisez pas de clause WHERE lors de l’exécution d’une instruction UPDATE, la base de données apportera des modifications à tous les enregistrements de la base de données, ce qui est probablement une erreur. Assurez-vous d’avoir une clause WHERE dans votre instruction SQL pour éviter cette erreur.

La syntaxe de l’instruction UPDATE dépend du moteur de base de données utilisé. Les bases de données SQL MySQL et Oracle utilisent une syntaxe similaire pour leurs instructions de MISE À JOUR. Dans les exemples suivants, le prénom d’un client est remplacé par « John », où l’identifiant du client est 44.

Comment utiliser INSERT dans SQL : exemples

Lorsque vous souhaitez ajouter un nouvel enregistrement à une table, vous utilisez l’instruction INSERT SQL. La plupart des concepteurs de bases de données créent une colonne par défaut pour donner à chaque enregistrement un identifiant unique. L’identifiant unique se remplit automatiquement, vous ne l’insérez donc pas manuellement et vous permettez au moteur de base de données de le faire pour vous. Vous ne pouvez pas insérer de valeurs en double dans les lignes d’identification, il est donc plus efficace de permettre à la base de données de le faire pour vous.

Dans les exemples suivants, un nouveau client est ajouté à la table Client avec un prénom et un nom renseignés dans les colonnes appropriées. Notez que les colonnes sont définies avec les valeurs à ajouter à chaque colonne respectivement.

Comment utiliser UPSERT dans SQL : exemples

La commande UPSERT est utile lorsque vous souhaitez insérer une ligne uniquement si elle n’existe pas déjà. S’il existe déjà, la base de données met à jour l’enregistrement avec de nouvelles informations. Le moteur de base de données Oracle a une commande UPSERT spécifique. Avec MySQL, la commande utilise plutôt le terme REMPLACER.

Les développeurs d’applications utilisent la commande UPSERT pour éviter les enregistrements en double, en particulier lorsqu’ils ont des identifiants uniques qui leur sont associés, et les énoncés d’application ne doivent pas insérer un enregistrement en raison d’un enregistrement existant précédemment. Cela arrive souvent lorsque vous importez des données d’une table à une autre, et il est possible que des enregistrements en double existent. Par exemple, vous obtenez une liste des dossiers clients d’une entreprise acquise et vous savez que certains clients sont déjà dans la base de données professionnelle actuelle. La déclaration UPSERT ne fera que mettre à jour les clients existants et en ajouter de nouveaux là où ils n’existent pas.

Dans l’exemple ci-dessus, si le client avec un identifiant de 44 existe déjà, l’enregistrement d’origine est supprimé, puis un nouvel enregistrement client avec un identifiant de 44 est ajouté. Il est important de se rappeler que la commande REPLACE ne met pas à jour techniquement les données. Au lieu de cela, il supprime et rajoute une ligne au tableau.

Avec Oracle, la commande UPSERT met à jour le client avec un identifiant de 44 plutôt que de le supprimer et de le rajouter. Si le dossier n’existe pas, le moteur Oracle ajoutera le dossier client à la table.

PostGreSQL n’a pas d’instruction UPSERT spécifique, mais prend en charge un type d’INSERT où le serveur n’insèrera un nouvel enregistrement que s’il n’existe pas déjà. Si l’enregistrement existe, les contraintes de table doivent générer une erreur et effectuer une MISE À JOUR plutôt qu’une instruction INSERT. La syntaxe PostGreSQL est la suivante :

Microsoft SQL Server ne prend pas non plus en charge une instruction UPSERT, mais les développeurs peuvent utiliser la commande MERGE pour effectuer une action similaire. L’instruction MERGE prend un jeu de données source et le fusionne avec une table, mais insère uniquement un nouvel enregistrement s’il n’existe pas de ligne. S’il existe une ligne, l’instruction MERGE mettra à jour l’enregistrement. 

MongoDB dispose d’un paramètre de commande UPDATE pour indiquer à la base de données d’exécuter une instruction UPSERT. Comme les autres bases de données, MongoDB insère un nouvel enregistrement uniquement s’il n’existe pas. Si elle existe, la base de données s’exécute et se met à jour sur un enregistrement.

MISE À JOUR et INSERTION : Différences entre SQL

La plupart des applications utilisent plusieurs instructions de MISE À JOUR et d’INSERTION pour gérer les données. Les énoncés INSERT sont nécessaires lorsque vous devez ajouter un dossier. Lorsque vous devez modifier des données déjà stockées, l’instruction MISE À JOUR est nécessaire.

L’instruction INSERT nécessite que toutes les colonnes soient remplies avec les valeurs nécessaires. La déclaration de MISE À JOUR ne nécessite pas la clause WHERE, mais si vous l’excluez, tous les enregistrements sont mis à jour avec les données données données. Il est peu probable que vous souhaitiez mettre à jour tous les enregistrements, alors assurez-vous d’inclure la clause WHERE.

Vous ne pouvez pas utiliser UPDATE à la place de INSERT, mais la déclaration UPSERT est une bonne alternative. Avec l’instruction UPSERT, la base de données met à jour les enregistrements là où ils sont disponibles et les insère dans le tableau si l’enregistrement n’existe pas. INSERT est plus rapide qu’une déclaration de MISE À JOUR, à condition qu’une base de données soit correctement optimisée.

UPSERT vs. MISE À JOUR et INSERTION : quel est le meilleur système ?

L’énoncé que vous utilisez dépend de ce que vous souhaitez faire des données de votre base de données. Pour des raisons de performance, INSERT est préférable à UPSERT, mais vous ne pouvez pas toujours éviter d’utiliser une déclaration de MISE À JOUR et vous devez disposer d’un moyen de vérifier que le dossier n’existe pas déjà. L’instruction UPSERT simplifie l’ensemble du processus au lieu d’écrire une instruction IF plus longue dans une procédure stockée. Lorsque vous avez des mises à jour importantes ou que vous insérez des énoncés pour importer des données et que vous ne souhaitez pas de doublons, l’énoncé UPSERT est plus performant. Vous effectuez à la fois la MISE À JOUR et l’INSERTION en une seule action.

Quand utiliser la MISE À JOUR dans SQL

La seule façon de modifier les données d’une table de base de données est avec l’instruction UPDATE. Les applications modifient constamment les données pour diverses raisons, et elles utilisent des instructions SQL UPDATE dans le backend. Lorsque vous modifiez vos coordonnées, vos données de carte de crédit ou l’adresse de livraison d’un compte en ligne, il est probable que le système d’application backend exécute un relevé de MISE À JOUR.

Utilisez l’option MISE À JOUR lorsque vous n’avez qu’à modifier les données et que les doublons ne sont pas un problème. Une simple instruction de MISE À JOUR n’est pas lente, mais plus le nombre de colonnes et de lignes à modifier peut ralentir les services de base de données. Il peut être utile d’effectuer une déclaration de MISE À JOUR de lots volumineux pendant les heures creuses.

Quand utiliser INSERT dans SQL

Vous avez besoin de l’instruction INSERT lorsque vous souhaitez ajouter un enregistrement à une table. Chaque fois que vous vous inscrivez à une application ou que vous commandez un nouveau produit dans un magasin d’e-commerce, la base de données backend utilise l’instruction INSERT SQL pour ajouter un nouvel enregistrement à la base de données. Le nouvel enregistrement peut être modifié ultérieurement avec la déclaration de MISE À JOUR, mais il a d’abord été créé avec la déclaration INSERT.

Les énoncés INSERT sont généralement rapides. Lorsque vous devez ajouter un enregistrement, cela est inévitable. Comme les instructions de MISE À JOUR, les gros inserts (comme l’importation de données à partir d’un fichier statique) peuvent être mieux optimisés s’ils s’exécutent pendant les heures creuses. Les fichiers journaux pour l’audit et la journalisation utilisent des instructions simples INSERT.

Quand utiliser UPSERT dans SQL

L’instruction UPSERT présente la performance la moins élevée des trois commandes, mais elle a un but lorsque vous avez plusieurs enregistrements à ajouter à une table et que vous ne souhaitez pas les dupliquer. Lorsque vous importez des données dans une table et que vous pensez qu’il pourrait y avoir des enregistrements en double, utilisez l’instruction UPSERT pour mettre à jour les enregistrements actuels au lieu d’en ajouter des doublons. Par exemple, si vous devez importer des clients à partir d’un fichier externe dans vos tables de base de données, une instruction UPSERT peut être plus appropriée que l’utilisation d’une instruction INSERT.

Les déclarations UPSERT sont généralement bénéfiques si vous disposez d’un vaste jeu de données source qui pourrait avoir des doublons. Par exemple, vous ne voudriez pas dupliquer un tableau de produits, vous utiliseriez donc UPSERT au lieu d’utiliser une seule instruction INSERT et de supprimer les doublons ultérieurement. UPSERT est idéal lorsque vous disposez de gros volumes de données, mais peut entraîner des problèmes de latence si elles sont utilisées pour toutes les déclarations INSERT inutilement. Utilisez uniquement UPSERT lorsque vous pouvez importer des doublons dans une table principale.

FAQ

UPSERT est généralement plus sûr que la logique « sélectionner puis insérer » roulée à la main dans des conditions de simultanéité élevées, car la détection et la résolution des conflits sont gérées dans une seule opération atomique. Vous devez tout de même vous assurer que les index et les contraintes uniques appropriés sont en place pour que la base de données puisse résoudre les conflits rapidement et éviter les verrouillages ou les conflits inutiles.

Le moyen le plus fiable d’éviter les doublons est de définir une clé primaire ou une contrainte unique sur la colonne ou l’ensemble de colonnes qui doivent être uniques, puis d’écrire votre INSERTION ou UPSERT autour de cette contrainte. Le moteur de base de données appliquera un caractère unique au moment de l’écriture, ce qui est plus fiable que d’essayer de vérifier manuellement les lignes existantes dans le code d’application.

UPSERT est particulièrement utile lorsque vous devez régulièrement créer ou mettre à jour le même enregistrement en fonction d’une clé, comme un ID utilisateur ou un ID de commande. Il simplifie la logique des applications, réduit les risques de conditions de course dues aux schémas de « vérification puis d’insertion » et se traduit souvent par moins d’allers-retours dans la base de données que l’émission d’instructions INSERT et UPDATE distinctes.

INSERT ajoute une toute nouvelle ligne, UPDATE modifie une ligne existante qui correspond déjà à vos critères, et UPSERT combine les deux comportements en insérant une nouvelle ligne lorsqu’il n’y en a pas ou en mettant à jour une ligne existante lorsqu’une correspondance est trouvée. En pensant à « créer », « modifier » et « créer ou modifier », vous pouvez choisir la bonne affirmation pour chaque cas d’utilisation.