2009-05-29 7 views
29

Jak wykryć, czy pewna tabela istnieje w danej bazie danych SQL w Javie?Jak mogę wykryć istnienie tabeli SQL w Javie?

+1

Zależy od serwera bazy danych. Zwykle znajduje się w nim tabela ze wszystkimi nazwami tabel, można ją po prostu zapytać. – GEOCHET

+0

Przepraszam, to jest mój pierwszy raz przy użyciu SQL, DB jest w Access –

+3

java.sql.DatabaseMetaData.getTables jest cross-bazy danych (sterownik JDBC dba o różnice bazy danych). –

Odpowiedz

34

Możesz użyć DatabaseMetaData.getTables(), aby uzyskać informacje o istniejących tabelach.

Ta metoda działa transparentnie i jest niezależna od silnika bazy danych. Wydaje mi się, że pyta o tabele schematów informacyjnych za kulisami.

Edit:

Oto 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

Dzięki, to jest idealne. –

+0

Ten przykład nie działa dla mnie. Zobacz - http://stackoverflow.com/questions/11699023/program-runs-without-exception-but-shows-no-table-names –

1

To nie jest specyficzny dla danego języka, ale problem związany z bazą danych. Zapytałbyś metadane w bazie danych o istnienie tego konkretnego obiektu.

W SQL Server, na przykład:

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

napisać kwerendę, która wysyła zapytanie do tabeli/widoku, który wyświetla listę tabel (jest różna w zależności od producenta DB). Zadzwoń do tego z Javy.

Googling information_schema.tables bardzo pomoże.

0

zależności od DB, można to zrobić (MySQL)

SHOW TABLES 

lub (Oracle)

SELECT * FROM user_objects WHERE object_type = 'TABLE' 

lub inną rzeczą dla SQL Server. Przejrzyj wyniki dla MySQL lub dalszego filtra na Oracle.

1

Dlaczego nie zobaczyć, czy jest w sysobjects (dla SQL Server)?

13

Użyj java.sql.DatabaseMetaData.getTables(null, null, YOUR_TABLE, null). Jeśli tabela istnieje, dostaniesz ResultSet z jednym rekordem.

Zobacz DatabaseMetaData.getTables

0

dla MS Access:

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

dla wszystkich baz danych zgodnych z ANSI: (MySQL, SQL Server 2005/2008, Oracle, PostgreSQL, SQLLite, może inni)

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

Próbuję zrobić to przeciwko RDS Amazon (z systemem MySql), a rozwiązania tutaj opublikowane nie działają. Wszystko po prostu zwraca pusty ResultSet.

Jedyne co udało mi się dostać do pracy jest:

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

Nie jestem pewien, czy problemy z innymi rozwiązaniami w tym wątku są unikalne dla RDS czy jest to coś, o JDBC umyka mi.

Powiązane problemy