web-dev-qa-db-fra.com

Vérifier si la table existe

J'ai une application de bureau avec une base de données intégrée. Lorsque j'exécute mon programme, je dois vérifier que cette table spécifique existe ou la créer sinon.

Etant donné un objet Connection nommé conn pour ma base de données, comment puis-je vérifier cela?

78
Dmitry

Vous pouvez utiliser les métadonnées disponibles:

  DatabaseMetaData meta = con.getMetaData();
  ResultSet res = meta.getTables(null, null, "My_Table_Name", 
     new String[] {"TABLE"});
  while (res.next()) {
     System.out.println(
        "   "+res.getString("TABLE_CAT") 
       + ", "+res.getString("TABLE_SCHEM")
       + ", "+res.getString("TABLE_NAME")
       + ", "+res.getString("TABLE_TYPE")
       + ", "+res.getString("REMARKS")); 
  }

Voir ici pour plus de détails. Notez également les mises en garde dans le JavaDoc .

65
Brian Agnew
DatabaseMetaData dbm = con.getMetaData();
// check if "employee" table is there
ResultSet tables = dbm.getTables(null, null, "employee", null);
if (tables.next()) {
  // Table exists
}
else {
  // Table does not exist
}
116
RealHowTo

En fait, je ne trouve aucune des solutions présentées ici complète, je vais donc ajouter les miennes. Rien de nouveau ici. Vous pouvez assembler cela à partir des autres solutions présentées et de divers commentaires.

Vous devez vous assurer au moins deux choses:

  1. Assurez-vous de transmettre le nom de la table à la méthode getTables() , Plutôt que de transmettre une valeur null. Dans le premier cas, vous laissez le serveur de base de données Filtrer le résultat pour vous. Dans le second cas, vous demandez à Une liste des tables all du serveur, puis vous filtrez la liste Localement. Le premier est beaucoup plus rapide si vous ne recherchez qu'une table unique

  2. Assurez-vous de vérifier le nom de la table à partir du jeu de résultats avec une correspondance égale La raison en est que la fonction getTables() effectue une recherche de motif sur La requête pour la table et que le caractère _ est un caractère générique dans SQL . Supposons que vous vérifiez l'existence d'une table nommée EMPLOYEE_SALARY. Vous obtiendrez alors une correspondance sur EMPLOYEESSALARY aussi Ce qui n'est pas ce que vous voulez.

Ohh, et n'oubliez pas de fermer ces résultats. Depuis Java 7, vous voudriez utiliser une instruction try-with-resources pour cela.

Voici une solution complète:

public static boolean tableExist(Connection conn, String tableName) throws SQLException {
    boolean tExists = false;
    try (ResultSet rs = conn.getMetaData().getTables(null, null, tableName, null)) {
        while (rs.next()) { 
            String tName = rs.getString("TABLE_NAME");
            if (tName != null && tName.equals(tableName)) {
                tExists = true;
                break;
            }
        }
    }
    return tExists;
}

Vous voudrez peut-être considérer ce que vous transmettez comme paramètre types (4ème paramètre) lors de votre appel getTables(). Normalement, je partirais à null parce que vous ne voulez pas vous limiter. Une vue vaut comme une table, non? De nos jours, de nombreuses bases de données vous permettent de mettre à jour via une vue. Par conséquent, vous limiter au type TABLE n’est généralement pas la solution. YMMV.

8
peterh

Ajoutant au message de Gaby, mon jdbc getTables () pour Oracle 10g nécessite l’utilisation de toutes les capitales:

"employee" -> "EMPLOYEE"

Sinon, j'aurais une exception:

Java.sql.SqlExcepcion épuisé les résultats

(même si "employé" est dans le schéma)

6
wawiwa
    /**
 * Method that checks if all tables exist
 * If a table doesnt exist it creates the table
 */
public void checkTables() {
    try {
        startConn();// method that connects with mysql database
        String useDatabase = "USE " + getDatabase() + ";";
        stmt.executeUpdate(useDatabase);
        String[] tables = {"Patients", "Procedures", "Payments", "Procedurables"};//thats table names that I need to create if not exists
        DatabaseMetaData metadata = conn.getMetaData();

        for(int i=0; i< tables.length; i++) {
            ResultSet rs = metadata.getTables(null, null, tables[i], null);
            if(!rs.next()) {
                createTable(tables[i]);
                System.out.println("Table " + tables[i] + " created");
            }
        }
    } catch(SQLException e) {
        System.out.println("checkTables() " + e.getMessage());
    }
    closeConn();// Close connection with mysql database
}
1
Konstantin F

Si vous utilisez jruby, voici un extrait de code renvoyant un tableau de toutes les tables d’une base de données.

require "rubygems"
require "jdbc/mysql"
Jdbc::MySQL.load_driver
require "Java"

def get_database_tables(connection, db_name)
  md = connection.get_meta_data
  rs = md.get_tables(db_name, nil, '%',["TABLE"])

  tables = []
  count = 0
  while rs.next
    tables << rs.get_string(3)
  end #while
  return tables
end
0
DBulgatz