Pregunta Compruebe si existe una tabla


Tengo una aplicación de escritorio con una base de datos integrada. Cuando ejecuto mi programa, necesito verificar que exista una tabla específica, o crearla si no.

Dado un objeto Connection llamado conn para mi base de datos, ¿cómo podría verificar esto?


73
2018-05-31 10:03


origen


Respuestas:


Puede usar los metadatos 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")); 
  }

Ver aquí para más detalles. Tenga en cuenta también las advertencias en el JavaDoc.


60
2018-05-31 10:04



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
}

115
2018-05-31 11:21



Agregando a la publicación de Gaby, mi jdbc getTables () para Oracle 10g requiere que todos los topes funcionen:

"employee" -> "EMPLOYEE"

De lo contrario, obtendría una excepción:

java.sql.SqlExcepcion agotado resultados

(aunque "empleado" está en el esquema)


6
2018-04-16 16:19



En realidad, no encuentro que ninguna de las soluciones presentadas aquí esté completamente completa, así que agregaré la mía. Nada nuevo aquí. Puede unir esto de las otras soluciones presentadas más varios comentarios.

Hay al menos dos cosas que debes asegurarte:

  1. Asegúrese de pasar el nombre de la tabla al getTables() método, en lugar de pasar un valor nulo. En el primer caso, deja que el servidor de base de datos filtra el resultado para usted, en el segundo que solicita una lista de todas tablas del servidor y luego filtrar la lista en la zona. El primero es mucho más rápido si solo buscas un mesa individual

  2. Asegúrese de verificar el nombre de la tabla del conjunto de resultados con un igual partido. La razón es que el getTables() hace coincidencia de patrones en la consulta para la tabla y el _ personaje es un comodín en SQL. Supongamos que está comprobando la existencia de una tabla llamada EMPLOYEE_SALARY. A continuación, obtendrá una coincidencia en EMPLOYEESSALARY también que no es lo que quieres

Ohh, y recuerda cerrar esos resultados. Desde Java 7, querrás usar un declaración try-with-resources para eso.

Aquí hay una solución completa:

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;
}

Es posible que desee considerar lo que pasa como el types parámetro (4º parámetro) en su getTables() llamada. Normalmente me iría a las null porque no quieres restringirte. UNA VISTA es tan buena como una MESA, ¿verdad? En estos días, muchas bases de datos le permiten actualizar a través de una VISTA, por lo que restringirse a solo el tipo de TABLA no es, en la mayoría de los casos, el camino a seguir. YMMV.


6
2017-09-10 07:07



    /**
 * 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
2018-04-29 22:05



Si usa jruby, aquí hay un fragmento de código para devolver una matriz de todas las tablas en un db.

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
2018-03-21 16:18