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. P>
Le tableau ressemble à ceci: p>
5 Réponses :
Ceci est défini dans SQL3 comme Fusionner a >. P>
Bonne solution, dommage que beaucoup de bases de données ne soutiennent pas encore cela :(
SQL Server 2005 prend en charge la fusion, de même que Oracle 9i (et supérieur)
SQL 2005 ne prend pas en charge la fusion, elle a été introduite dans SQL 2008
Utilisez un UPSert Paire de commandes:
insert into test_table select 1,'xxx', 999 from dual where exists <...>
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
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é: si vous voulez le poids initial d'une entrée créée pour être (par exemple) 72, utilisez-la comme la première instruction: p>
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)
/
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
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 em> : qui active L'émulation d'un insert si elle n'existe pas em> instruction: p> dans le cas de la question de l'OP qui serait suivi em> Par une mise à jour simple: p>
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 code> devient de (SELECT 0 comme i) que Mutex Gauche Rejoignez test_table code>
Malheureusement, cette modification n'a pas fonctionné sur HSQLDB lorsque je l'ai essayée. Travaillé bien sur PostgreSQL cependant.