2009-05-29 19 views
29

¿Cómo puedo detectar si existe una determinada tabla en una base de datos SQL determinada en Java?¿Cómo puedo detectar la existencia de una tabla SQL en Java?

+1

Depende de qué servidor de base de datos. Por lo general, hay una tabla con todos los nombres de tabla, solo puede consultarla. – GEOCHET

+0

lo siento esta es la primera vez que uso SQL, la base de datos está en Access –

+3

java.sql.DatabaseMetaData.getTables es una base de datos cruzada (el controlador JDBC se encarga de las diferencias de la base de datos). –

Respuesta

34

Puede utilizar DatabaseMetaData.getTables() para obtener información acerca de las tablas existentes.

Este método funciona de forma transparente y es independiente del motor de la base de datos. Creo que consulta tablas de esquema de información detrás de escena.

Editar:

Aquí es an example that prints all existing table names.

DatabaseMetaData md = connection.getMetaData(); 
ResultSet rs = md.getTables(null, null, "%", null); 
while (rs.next()) { 
    System.out.println(rs.getString(3)); 
} 
+0

Gracias que es perfecto. –

+0

Ese ejemplo no funciona para mí. Ver - http://stackoverflow.com/questions/11699023/program-runs-without-exception-but-shows-no-table-names –

1

Esto no es un problema específico del idioma, sino de una base de datos. Debería consultar los metadatos en la base de datos para la existencia de ese objeto en particular.

En SQL Server, por ejemplo:

SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[table]') 
    AND type in (N'U') 
2

escribir una consulta que consulta la tabla/vista que mostrará una lista de las tablas (esto es diferente en función de proveedor DB). Llama eso desde Java.

Google information_schema.tables ayudará mucho.

0

Dependiendo de la base de datos, puede hacerlo (MySQL)

SHOW TABLES 

o (Oracle)

SELECT * FROM user_objects WHERE object_type = 'TABLE' 

u otra cosa para SQL Server. Ciclo a través de los resultados de MySQL o un filtro adicional en el de Oracle.

1

¿Por qué no simplemente ver si está en sysobjects (para SQL Server)?

SELECT [name] FROM [sysobjects] WHERE type = 'U' AND [name] = 'TableName' 
13

Use java.sql.DatabaseMetaData.getTables(null, null, YOUR_TABLE, null). Si la tabla existe, obtendrá un ResultSet con un registro.

Ver DatabaseMetaData.getTables

0

de MS Access:

Select Count(*) From MSysObjects 
Where type=1 And name='your_table_name_here' 
1

para todas las bases compatible con ANSI: (MySQL, SQL Server 2005/2008, Oracle, PostgreSQL, SqlLite, tal vez otros)

select 1 from information_schema.tables where table_name = @tableName 
1

Estoy tratando de hacer esto en contra del RDS de Amazon (ejecutando MySql), y las soluciones publicadas aquí no funcionan. Todo simplemente devuelve un ResultSet vacío.

Lo único que he podido llegar al trabajo es:

Connection connection = DriverManager.getConnection(DatabaseUrl, DatabaseUserName, DatabasePassword); 
PreparedStatement s = connection.prepareStatement("use mySampleDatabase;");  
s.execute(); 

PreparedStatement s2 = connection.prepareStatement("Show Tables;"); 
ResultSet rs = s2.executeQuery(); 

while (rs.next()) { 
    System.out.println(rs.getString(1)); 
} 

No estoy seguro de si los problemas con las otras soluciones en este tema son exclusivos de RDS o es algo sobre JDBC que me está eludiendo

Cuestiones relacionadas