9
votes

ANSI SQL Question - Comment insérer ou mettre à jour un enregistrement s'il existe déjà?

Bien que j'utilise MySQL (pour l'instant), je ne veux pas de dB spécifique SQL.

J'essaie d'insérer un enregistrement s'il n'existe pas et mettez à jour un champ si cela existe. Je veux utiliser ANSI SQL.

Le tableau ressemble à ceci: xxx

sql

0 commentaires

5 Réponses :



1
votes

Utilisez un UPSert Paire de commandes:

insert into test_table
select 1,'xxx', 999
from dual where exists <...>


1 commentaires

Non: vous pouvez également utiliser la double table dans MySQL. Et dans SQL Server, vous pouvez tout d'omettre si tout ce que vous avez besoin est de sélectionner .



0
votes

Un moyen de faire cela consiste simplement à exécuter une commande d'insertion et de mise à jour, en ignorant l'erreur du premier s'il y a déjà un enregistrement avec cette clé: xxx

si vous voulez le poids initial d'une entrée créée pour être (par exemple) 72, utilisez-la comme la première instruction: xxx


0 commentaires

10
votes

Pour une longue période, cette opération nécessitait deux commandes distinctes plus un cadre pour le gérer. D'où le nom upsert (mise à jour ou insert). Mais des versions plus récentes de certaines saveurs de DBMS supportent des solutions plus élégantes.

La norme ANSI définit une syntaxe de fusion . Ceci a été pris en charge à Oracle depuis la version 9i et dans MS SQL Server depuis 2005. Les déclarations de fusion peuvent être quelque peu verbeuses. P>

merge into t23
using t42
on t42.id = t23.id
when matched then
    update
    set     t23.col1 = t42.col1
when not matched then
    insert  (id, col1)
    values  (t42.id, t42.col1)
/


3 commentaires

J'ai fini par utiliser l'insert .. sur la mise à jour de la clé en double


MS SQL Server 2005 ne prend pas en charge la syntaxe de fusion. Seul SQL Server 2008 et ci-dessus l'appuient.


On dirait que SQL Server 2005 Beta l'avait eu mais pas la version finale. 2008 l'a eu. Référence: geekswithblogs.net/sabotshell/archive/2005/08/20/ 50706.aspx



3
votes

Une approche conforme aux normes SQL plus anciennes et donc compatible avec une gamme plus large de SGBD (à partir de maintenant SQLite, par exemple, ne prend pas en charge la fusion ) consiste à utiliser une technique impliquant une table mutex : xxx

qui active L'émulation d'un insert si elle n'existe pas instruction: xxx

dans le cas de la question de l'OP qui serait suivi Par une mise à jour simple: xxx


3 commentaires

En fait, je pose cela pour ma propre référence parce que la source que j'avais (xaprb.com) ne se présente pas facilement sur Google Recherches. :)


J'aime votre solution, car cela devrait fonctionner sur presque tous les SGBD. Mais j'ai trouvé une petite amélioration. Vous n'avez réellement besoin de la table mutex. Il suffit de faire un sous-sélection alors de mutex gonejoker test_table devient de (SELECT 0 comme i) que Mutex Gauche Rejoignez test_table


Malheureusement, cette modification n'a pas fonctionné sur HSQLDB lorsque je l'ai essayée. Travaillé bien sur PostgreSQL cependant.