Question

Existe-t-il un moyen portable de déterminer si une table de base de données existe déjà ou non?

Était-ce utile?

La solution

Portable? Je ne pense pas.

Peut-être que le plus proche que vous puissiez obtenir est:

select * from <table>

Et cela renverrait une erreur si la table n'existe pas.

Autres conseils

C’est aussi portable que possible, malheureusement:

select
    count(*)
from
    information_schema.tables
where
    table_name = 'tablename'
    and table_schema = 'dbo'

Cela fonctionne vraiment sur SQL Server, MySQL et Postgres. Pas tellement sur Oracle, cependant. Vous devrez accéder au dictionnaire de données Oracle pour cela. Cependant, il existe un projet open source qui crée information_schema dans Oracle à partir du dictionnaire de données. Vous pouvez essayer cela si vous avez besoin d'une portabilité absolue.

Le schéma P.S. ne doit pas nécessairement être dbo, mais c'est le plus courant.

Je dirais

select 'x' from <table_name> where 0=1;

L’inconvénient est que si vous obtenez une erreur, vous ne savez pas avec certitude quelle en est la cause réelle. Il se peut qu'il manque une table ou par exemple une erreur de connexion. Vous pouvez analyser le message d'erreur, mais il ne serait certainement pas portable.

Les vues INFORMATION_SCHEMA sont conformes à la norme ANSI. Celles-ci devraient donc être votre option la plus portable. N'oubliez pas d'ajouter le type de schéma et de table à votre clause where ...

if exists(select  *
          from    information_schema.tables
          where   table_schema = 'dbo'
                  and table_name = 'MyTable'
                  and table_type = 'basetable')
begin
     -- your code here
end

Voici quelque chose qui est raisonnablement portable:

  

sélectionnez maintenant () dans TABLE limite 1;

Cela ne dépend pas de la connaissance d'une colonne particulière.

Cela n'entraîne pas la surcharge que compte parfois (*).

Peu importe que la table soit vide ou non.

Il échoue si la table n'existe pas.

Comme chaque SGBD a sa propre métabase, je pense que le plus & "portable &"; Pour ce faire, vous utilisez l’appelant de l’application. Quelque chose comme

try
    execute("select top 1 * from table")
    return (true)
catch
    return false

Essayez d’interroger la table. Si la requête échoue, vous obtenez une erreur qui n'existe pas.

C’est probablement aussi portable que vous pouvez l’obtenir. La charge de production du résultat dépend alors du code interrogeant la table / la base de données.

select top 1 *
from MyTable

Conservez la requête aussi simple que possible pour éviter d’autres erreurs possibles.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top