PostgreSQL

PostgreSQL Upsert en cas de conflit

PostgreSQL Upsert en cas de conflit
L'expression 'Upsert' est reconnue comme une fusion dans le SGBDR. Un 'Upsert' est utile avec PostgreSQL si vous ne voulez pas traiter des erreurs de violation de restriction uniques dues à des entrées répétées. Lorsque vous exécutez une commande UPDATE générique, les ajustements nécessaires ne se produisent que si un enregistrement correspond aux normes de commande ; si aucune donnée n'existe, rien ne se passe. Lorsque vous ajoutez une nouvelle ligne à une table, PostgreSQL mettra à jour la ligne si elle existait auparavant, ou bien il incorporera la nouvelle ligne si la ligne n'existait pas. Le mot-clé SQL 'Upsert' combine les mots "update" et "insert.” Cet article vous montre comment fonctionne la fonctionnalité 'Upsert' de PostgreSQL, ainsi que comment utiliser la fonctionnalité 'Upsert' pour ajouter ou mettre à jour des informations si la ligne insérée existe déjà dans la table.

Syntaxe

Voici la syntaxe de la requête 'Upsert' ON CONFLICT.

>> INSERT INTO table_name (column_list) VALUSE (value_list) ON CONFLICT action cible ;

Lancer le shell de ligne de commande PostgreSQL

Pour commencer, lancez le shell de ligne de commande PostgreSQL depuis le menu Application. Connectez-le au serveur requis. Entrez le nom de la base de données sur laquelle vous souhaitez travailler. Pour travailler sur un autre port, saisissez le numéro de port et le nom d'utilisateur avec lesquels vous souhaitez travailler. Pour continuer avec les paramètres par défaut, laissez les espaces tels quels et appuyez sur « Entrée » à chaque option. Ajoutez un mot de passe pour le nom d'utilisateur sélectionné et votre shell de commande devrait être prêt à être utilisé.

Exemple 1:

Maintenant, nous pouvons commencer avec 'Upsert' en conflit. Supposons que vous ayez une table intitulée « personne » dans une base de données sélectionnée avec des champs qui affichent les enregistrements de différentes personnes. Ces enregistrements montrent les noms des personnes, leurs âges, leurs villes et leurs pays. Le tableau est affiché ci-dessous.

>> SÉLECTIONNER * À PARTIR de la personne ;

Il est important de savoir comment une erreur ou un conflit peut survenir. Le champ de la table 'id', qui est également une clé primaire, contient des valeurs de 1 à 15. Lorsque l'utilisateur essaie d'insérer des enregistrements en double dans la table, le conflit se produit.

Essayons l'instruction INSERT suivante, en insérant les enregistrements dans la table 'person'. Cette requête provoquera une erreur car la valeur '3' du champ 'id' existe déjà dans la table.

>> INSÉRER DANS LES VALEURS de la personne (identifiant, nom, âge, ville, pays) ( '3', 'Habib', '45', 'Chakwal', 'Pakistan');

Exemple 2 : Upsert avec la clause ON CONFLICT

Nous utiliserons la clause ON CONFLICT pour éviter la requête INSERT qui provoque cette erreur en raison de l'insertion des enregistrements en double. La commande ON CONFLICT propose deux phrases avec des usages différents.

Exemple 3 : Upsert avec la clause DO NOTHING

Dans cet exemple, nous allons examiner la clause DO NOTHING. Cette clause précise qu'aucune opération ne sera effectuée en cas d'erreur ou de conflit. En d'autres termes, cette clause évitera uniquement les conflits ou les erreurs.

Essayons donc la même commande INSERT que nous avons utilisée précédemment pour ajouter des enregistrements en double à la table 'person', avec quelques modifications ajoutées. Nous avons ajouté la clause ON CONFLICT, ainsi que l'instruction DO NOTHING dans cette clause. La clause ON CONFLICT a été appliquée à la colonne unique 'id'. Cela signifie que, lorsque l'utilisateur tente d'insérer la valeur en double dans la colonne 'id', il évitera le conflit et ne fera rien. Comme vous pouvez le voir dans l'image ci-dessous, il n'insérera même pas le nouvel enregistrement dans la table, ni ne mettra à jour l'enregistrement précédent.

>> INSÉRER DANS LES VALEURS de la personne (identifiant, nom, âge, ville, pays) ( '3', 'Habib', '45', 'Chakwal', 'Pakistan') ON CONFLIT (id) NE RIEN FAIRE

Vérifions à nouveau la table 'personne' pour des raisons d'authenticité. Comme vous pouvez le voir dans l'image ci-dessous, aucune modification n'a été apportée au tableau.

>> SÉLECTIONNER * À PARTIR de la personne ;

Exemple 2 : Upsert avec clause DO

Ensuite, nous examinerons les clauses ON CONFLICT et DO. Comme son nom l'indique, la clause ___ effectuera une action en cas d'erreur ou de conflit lorsqu'une valeur en double est insérée dans une table. Nous utiliserons la même commande d'insertion que nous avons utilisée précédemment pour insérer un enregistrement en double dans la table 'person', avec une modification mineure. Nous avons ajouté la clause ON CONFLICT avec la clause DO à l'intérieur. Lorsque l'utilisateur tente d'insérer la valeur non unique dans la colonne 'id', il effectuera une action pour éviter le conflit. Nous avons utilisé la clause UPDATE après la clause DO, qui indique une mise à jour des données de la table 'person'. Le mot-clé SET est utilisé pour définir la valeur de la colonne 'nom' sur la nouvelle valeur, 'Habib', en utilisant le mot-clé EXCLUDED où l''id' est '3' à l'heure actuelle. Si vous exécutez la requête suivante, vous verrez que la requête a été effectuée.

>> INSÉRER DANS personne (identifiant, nom, âge, ville, pays) VALEURS ( '3', 'Habib', '45', 'Chakwal', 'Pakistan') ON CONFLICT (id) METTRE À JOUR SET nom = EXCLU.Nom;

Les enregistrements de la table 'person' doivent être récupérés pour voir les modifications apportées à la requête ci-dessus. Si vous exécutez la requête suivante dans le shell de ligne de commande, vous devriez voir la sortie suivante.

>> SÉLECTIONNER * DE LA personne ;

Comme vous pouvez le voir dans la sortie ci-dessous, le nom de la personne a été mis à jour en "Habib", où "id" est "3.'

Vous pouvez également mettre à jour les enregistrements dans plusieurs colonnes à l'aide du mot clé EXCLUDED dans la clause ON CONFLICT de la requête INSERT, comme indiqué ci-dessous.

>> INSÉRER DANS personne (identifiant, nom, âge, ville, pays) VALEURS ( '3', 'Habib', '45', 'Chakwal', 'Pakistan') ON CONFLICT (id) METTRE À JOUR SET nom = EXCLU.nom, ville = EXCLU.ville;

Les changements sont indiqués ci-dessous.

>> SÉLECTIONNER * DE LA personne ;

Conclusion

Cet article vous a montré comment utiliser PostgreSQL 'Upsert' avec la clause ON CONFLICT, ainsi que les actions DO et DO NOTHING. Après avoir lu cet article, nous espérons qu'il vous sera plus facile de comprendre comment utiliser PostgreSQL 'Upsert.'

Comment installer et jouer à Doom sur Linux
Introduction à Doom La série Doom est née dans les années 90 après la sortie du Doom original. Ce fut un succès instantané et à partir de ce moment-là...
Vulkan pour les utilisateurs Linux
Avec chaque nouvelle génération de cartes graphiques, nous voyons les développeurs de jeux repousser les limites de la fidélité graphique et se rappro...
OpenTTD contre Simutrans
Créer votre propre simulation de transport peut être amusant, relaxant et extrêmement attrayant. C'est pourquoi vous devez vous assurer que vous essay...