H2: comment savoir si la table existe?
Je suis en train d'écrire du code Java qui vérifie si un H2 table existe: si elle n'existe pas, il exécute pour la première fois un CREATE TABLE
requête qui crée la table avant de poursuivre plus loin.
J'ai suivi les conseils en Google Groupes en question mais il ne fonctionne tout simplement pas.
Si j'exécute la requête suivante:
SELECT COUNT(*) AS count FROM information_schema.tables WHERE table_name = 'word_types'
- Je obtenir une seule ligne avec un COUNT
champ qui a une valeur de 0, ce qui indique que la word_types
tables n'existe pas. Mais quand je le lance:
SELECT * FROM word_types
Je serai de retour 0 jeux de résultats, mais le SQL frontend/GUI que j'utilise me montre tous les champs/colonnes qui existent dans le word_types
table. En outre, lorsque je de forage vers le bas dans ma base de données de la liste des tables disponibles (à l'aide de la même interface graphique), je vois word_types
existe.
Alors, quelle est la bonne requête à utiliser lorsque vous essayez de déterminer si un H2 table existe ou pas? À l'aide v1.3.173. Merci à l'avance!
- Il pourrait être un des majuscules/minuscules problème lors de l'interrogation de la table système. Essayez de nouveau avec la basse fonction.
- Pourquoi ne pas utiliser
CREATE TABLE IF NOT EXIST myTable
? Quelle est votre logique, vous vérifiez à chaque fois avant de faire une requête ou une seule fois lorsque l'application démarre? - Bien votre approche fonctionne très bien pour moi - si la première requête renvoie 0, que la deuxième donne un code d'erreur
Table doesn't exist
- Merci @DanBracuk (+1) - où dois-je appliquer la fonction lower? Pouvez-vous fournir un exemple de code? Merci encore!
- Merci @Admettre (+1) - n'est pas une mauvaise suggestion et si tout le reste échoue ici, je pourrais aller avec elle. Ma logique est de vérifier une fois à l'application de démarrage.
- Que c'est certainement une façon d'aller. Puisque vous allez faire juste une DB appel et si la table n'existe pas, rien ne se passera.
Vous devez vous connecter pour publier un commentaire.
Première: cochez la case dans laquelle vous tapez des tables noms de. C'est très important.
word_types
etWORD_TYPES
sont deux tables différentes.Deuxième: Si vous voulez vérifier si la table existe et si elle n'est pas alors en créer un, je vous recommande d'utiliser l'exemple suivant:
word_types
. Et quand je lanceSELECT * FROM word_types
je vois la table existe, mais pas les lignes de revenir (ce qui est correct, je n'ai pas inséré n'importe quoi encore). Mais je dois spécifier le nom de la table commeWORD_TYPES
dans la requête qui vérifie lainformation_schema.tables
tableau de l'existant de monword_types
table. Bizarre.information_schema.tables
et les commandes sont sensibles à la casse. Mais je ne peux pas vous dire pourquoi les noms sont stockés de cette manière.DATABASE_TO_UPPER
qui est responsable de ce comportement, parce qu'elle est définie àTRUE
par défaut.Il y a aussi une API JDBC qui permet d'interroger l'existence d'une ou de plusieurs tables.
C'est (en théorie) plus portable que d'une question directe qui utilise
information_schema
.(Dans la pratique, la portabilité est encore un peu limité par le fait que les différents SGBD définir et d'utiliser les concepts de schéma et de catalogue de façon légèrement différente).
Voilà comment cela fonctionne:
Au lieu de
"WORD_TYPES"
vous pouvez également utiliser SQL Style des caractères génériques, par exemple"WORD_%"
.Noter que H2 est un paramètre de configuration
DATABASE_TO_UPPER
qui est fixé àtrue
par défaut. Si aucun nom de la table est convertie en majuscules, qui est pourquoi vous avez besoin de requête pour la table en majuscules (ou un ensembleDATABASE_TO_UPPER
àfalse
).Aussi, en utilisant les autres paramètres (dont j'ai mis à
null
ici), vous pouvez restreindre la portée de la recherche à un scema ou type de table.Le jeu de résultats contient également des méta-informations sur le tableau, si vous avez besoin, par exemple, le schéma ou de tableau de commentaire.
Voir le JavaDoc pour une liste complète des options et des métadonnées.
Si la deuxième requête ne lance pas d'exception ou de retourner toutes les lignes, cela signifie juste que la table existe mais est vide.
Votre requête ci-dessus sera de retour les dossiers compte pas l'existence de votre table, pour que vous avez à feu le prédécesseur de la requête. Cette requête va vous renvoyer toutes les tables de votre Base de données et à partir de là, vous pouvez vérifier votre "word_types" existe ou pas.
UTILISATION YOURDBNAME
ALLER
SÉLECTIONNEZ *
À PARTIR de sys.Tables
ALLER
me répondre si ça fonctionne ou ne fonctionne également
Error: Syntax error in SQL statement "USE[*] MYAPP_DB GO SELECT * FROM SYS.TABLES GO "; expected "UPDATE, {"; SQL statement: USE myapp_db GO SELECT * FROM sys.Tables GO [42001-173] SQLState: 42001 ErrorCode: 42001
USE YOURDBNAME
est pour Microsoft SQL Server pour autant que je sais. La question est pour le H2 base de données toutefois.