22 Voix

Firebird: INSERT avec ON DUPLICATE KEY UPDATE

Question de PC Control | 27/10/2023 à 22:52

Je voudrais soit insérer des données dans une base de données Firebird, soit, si l'ID correspondant existe déjà, mettre à jour l'enregistrement avec cet ID. Je voudrais le faire en une seule requête afin de ne recevoir aucun message d'erreur et de ne pas avoir à vérifier d'abord si un ID est déjà dans la table.

Pour cela, MySQL dispose de la commande "INSERT ... ON DUPLICATE KEY UPDATE", qui est construite comme suit:

INSERT INTO tab (id, val) VALUES (10, 1)
  ON DUPLICATE KEY UPDATE val = val + 1;

Ceci insère un enregistrement avec id = 10 et val = 1 dans la table "tab", si l'id = 10 n'existe pas déjà. Cependant, si cet ID existe, la valeur de val de cette ligne est incrémentée de 1 à la place.

C'est exactement ce que j'aimerais faire avec Firebird maintenant aussi. Malheureusement, Firebird ne semble pas comprendre cette syntaxe et ne me donne toujours qu'un message d'erreur. Que puis-je faire? Cette option n'est-elle pas disponible dans Firebird?

RépondrePositifNégatif
2Meilleure Réponse2 Voix

Même dans Firebird, vous pouvez effectuer une INSERT "ON DUPLICATE KEY UPDATE". Cependant, dans Firebird, la syntaxe est un peu différente. Au lieu de la syntaxe MySQL, vous devez écrire "UPDATE OR INSERT".

Votre requête ci-dessus ressemblerait à ceci dans Firebird:

UPDATE OR INSERT INTO tab (id, val) 
  VALUES (10, 1);

La requête "UPDATE OR INSERT" de Firebird utilise automatiquement la ou les colonnes existantes avec PRIMARY KEY. Si vous n'avez pas de colonne PRIMARY KEY ou si vous souhaitez utiliser d'autres colonnes pour le match, vous pouvez utiliser le mot clé MATCHING à la fin de votre requête:

UPDATE OR INSERT INTO tab (id, val) 
  VALUES (10, 1) 
  MATCHING(id);

Après MATCHING entre parenthèses, vous définissez quelles colonnes doivent être utilisées pour le match. Dans cet exemple, j'ai repris la colonne "id" afin de correspondre à votre exemple.

Pour en savoir plus sur ce sujet, consultez la FAQ Firebird.
28/10/2023 à 11:23

RépondrePositif Négatif
Répondre

Sujets Connexes

Firebird: SELECT avec LIMIT

Question | 1 Réponse

Avis Important

Veuillez noter: Les contributions publiées sur askingbox.com sont des contributions d’utilisateurs et ne doivent pas remplacer les conseils d’un professionnel. Ils ne sont pas vérifiés par des indépendants et ne reflètent pas nécessairement l’opinion de askingbox.com. Apprendre encore plus.

Participer

Posez votre propre question ou écrivez votre propre article sur askingbox.com. Voici comment.