2009-05-29 4 views
29

Wie kann ich feststellen, ob eine bestimmte Tabelle in einer bestimmten SQL-Datenbank in Java existiert?Wie kann ich die Existenz einer SQL-Tabelle in Java erkennen?

+1

Hängt davon ab, welcher Datenbankserver. Es gibt normalerweise eine Tabelle mit allen Tabellennamen, die Sie einfach abfragen können. – GEOCHET

+0

Entschuldigung das ist mein erstes Mal mit SQL, die DB ist in Access –

+3

java.sql.DatabaseMetaData.getTables ist Cross-Datenbank (JDBC-Treiber kümmert sich um Datenbank Unterschiede). –

Antwort

34

Sie können DatabaseMetaData.getTables() verwenden, um Informationen zu vorhandenen Tabellen abzurufen.

Diese Methode funktioniert transparent und ist unabhängig von der Datenbank-Engine. Ich denke, es fragt Informationsschematabellen hinter den Kulissen ab.

Edit:

Hier ist 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

Danke das ist perfekt. –

+0

Dieses Beispiel funktioniert nicht für mich. Bitte sehen Sie - http://stackoverflow.com/questions/11699023/program-runs-without-exception-but-shows-no-table-names –

1

Dies ist kein sprachspezifisches, sondern ein datenbankspezifisches Problem. Sie würden die Metadaten in der Datenbank nach der Existenz dieses bestimmten Objekts abfragen.

In SQL Server zum Beispiel:

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

Schreiben Sie eine Abfrage, die die Tabelle/View-Abfragen, die die Tabellen auflistet (dies ist unterschiedlich, je nach DB-Anbieter). Rufen Sie das von Java an.

Googeln information_schema.tables wird viel helfen.

0

Je nach DB, können Sie (MySQL)

SHOW TABLES 

oder (Oracle)

SELECT * FROM user_objects WHERE object_type = 'TABLE' 

oder eine andere Sache, für SQL Server. Durchlaufen Sie die Ergebnisse für MySQL oder filtern Sie weiter auf der Oracle-Seite.

1

Warum nicht nur sehen, ob es in sysobjects (für SQL Server) ist?

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

Verwenden Sie java.sql.DatabaseMetaData.getTables(null, null, YOUR_TABLE, null). Wenn die Tabelle existiert, erhalten Sie eine ResultSet mit einem Datensatz.

Siehe DatabaseMetaData.getTables

0

Für MS Access:

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

Für alle ANSI-kompatible Datenbanken: (mySQL, SQL Server 2005/2008, Oracle, PostgreSQL, SQLLite, vielleicht andere)

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

Ich versuche, dies gegen Amazon RDS (mit MySql) zu tun, und die hier veröffentlichten Lösungen funktionieren nicht. Alles gibt nur ein leeres ResultSet zurück.

Das einzige, was ich in der Lage bin zu Arbeit zu bekommen ist:

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

Ich bin nicht sicher, ob die Probleme mit den anderen Lösungen in diesem Thread zu RDS einzigartig sind oder es ist etwas, über JDBC, dass entgeht mir.

Verwandte Themen