Apache Derby: comment puis-je faire "insert if not exists"?
Je suis en train de donner Apache Derbyaka JavaDB un tour. Je n'arrive pas à obtenir autour de la double de la clé des problèmes lors de l'insertion d'enregistrements qui peuvent déjà exister. Est-il un Derby équivalent à "insert if not exists
", ou "merge
" ?
De la même façon, il est un moyen de faire quelque chose comme "drop table foo if exists
"?
source d'informationauteur Limbic System
Vous devez vous connecter pour publier un commentaire.
Je n'ai jamais utilisé apache derby, mais une solution générale qui est assez indépendante de base de données est comme suit:
Pour insérer les valeurs " a " et " b " dans la table foo (avec des colonnes nommées A, B), mais seulement lorsque les valeurs ne sont pas déjà là, essayez quelque chose comme
Cela peut besoin de peaufinage pour un sgbd, mais l'idée est d'insérer le résultat d'un select qui retourne uniquement des valeurs lorsqu'il y a non.
C'est une astuce utile pour la création d'un idempotent de script sql (qui n'a rien de la deuxième fois qu'il est exécuté). Cependant, soyez prudent lors de l'utilisation de cette dans le code de production comme la
HAVING count(*)=0
peut être très lent sur de grandes tables.La demande à l'appui de la SQL:2003 MERGE est enregistré dans le Derby bug tracker https://issues.apache.org/jira/browse/DERBY-3155
Vous pourriez voter pour ce problème, ou, mieux encore, de contribuer à une mise en œuvre!
Sinon, les seules solutions que je connais de besoin, soit en sélectionnant la ligne en premier pour voir si elle existe, ou de l'insertion et de la capture de l'exception, comme d'autres l'ont noté.
Vous pouvez créer un package de cette logique dans une procédure de base de données pour la rendre un peu plus facile à exécuter.
Un standard de la façon dont je l'ai utilisé avec PostgreSQL DBs est quelque chose comme ce qui suit:
Pas sûr de savoir comment portable ou strictement conforme à la norme ANSI c'est bien. Le manque DE clause dans l'instruction SELECT externe en particulier peut être non standard. Lui donner un aller.
Derby en œuvre de FUSION dans 10.11: https://db.apache.org/derby/docs/10.11/ref/rrefsqljmerge.html
Notez que vous devez mettre à jour votre base de données à 10.11 avant de l'utiliser: https://db.apache.org/derby/docs/10.11/devguide/cdevupgrades.html
J'ai eu le même problème, et j'ai eu ce travail pour un insert avec une seule valeur /colonne de Derby. (Je n'ai jamais eu l'occasion de le tester avec plus, mais je n'ai aucune raison de supposer qu'il ne doit pas tout de même):
Il n'y a pas de support natif pour cela, d'aller faire un tour, je suis à l'aide d'eclipse, eclipse-lien va essayer de créer les tables et ignorer les erreurs qui surviennent à partir de la tentative de créer des tables qui existe déjà.
Si vous apportez des modifications de schéma, vous pouvez indiquer à eclipse lien pour déposer les tables avant de les créer.
Je suis à l'aide de cette solution, mais vous devez l'utiliser uniquement si vous avez la compréhension de la différence entre le en double dans la base de données et la de la double vue de l'utilisateur
Les doublons à partir de la vue de l'utilisateur sont deux enregistrements avec tous les champs identiques