2016-11-28 33 views
2

我有一個至少有500個表的數據庫。什麼是確切的代碼來獲取每個表的所有主鍵和外鍵?如何獲取JDBC中所有表的主鍵?

//Primary Key 
DatabaseMetaData meta=conn.getMetaData(); 
ResultSet rs1= meta.getTables(null, null, "TableName" , new String[]{"TABLE"}); 
rs1=meta.getPrimaryKeys(null, null, "TableName"); 
while(rs1.next()) 
    System.out.println("Primary Key :"+rs1.getString(4)); 

//Foreign Key 
rs1=meta.getExportedKeys(null, null, "TableName"); 
while(rs1.next()) 
    System.out.println("Foreign Key :"+rs1.getString(4)); 

我已經使用這個代碼,它給了我準確的密鑰,但對於500個表,我必須更改我的代碼500次。有什麼辦法可以儘量減少這種努力?

回答

1

你不需要修改你的代碼500次,你可以使用meta.getTables(null, null, "%", new String[]{"TABLE"})來檢索所有的表名。

方法getTables採用tableNamePattern參數的類似模式,因此"%"與所有表名稱匹配。

的方法getPrimaryKeysgetExportedKeys不採取一種模式,所以你需要循環的getTables結果和執行爲getTables結果集的每一行的方法。

所以,你需要做的是這樣:目錄和架構的

try (ResultSet tables = meta.getTables(null, null, "%", new String[] { "TABLE" })) { 
    while (tables.next()) { 
     String catalog = tables.getString("TABLE_CAT"); 
     String schema = tables.getString("TABLE_SCHEM"); 
     String tableName = tables.getString("TABLE_NAME"); 
     System.out.println("Table: " + tableName); 
     try (ResultSet primaryKeys = meta.getPrimaryKeys(catalog, schema, tableName)) { 
      while (primaryKeys.next() { 
       System.out.println("Primary key: " + primaryKeys.getString("COLUMN_NAME")); 
      } 
     } 
     // similar for exportedKeys 
    } 
} 

我已經包括檢索,因爲這可能會影響如何工作。

+0

非常感謝! 主鍵的代碼正在工作,但對於外鍵,它顯示此錯誤 - 「列名稱COLUMN_NAME無效」。 請親切指導。 –

+0

@KaushalDaga查看[getExportedKeys'的java文檔](http://docs.oracle.com/javase/8/docs/api/java/sql/DatabaseMetaData.html#getExportedKeys-java.lang.String-java。 lang.String-java.lang.String-)你可能需要使用'PKCOLUMN_NAME'。 –

+0

非常感謝您的幫助。 :) –

1

您可以參考此代碼片段,該代碼片段顯示如何從數據庫獲取所有表。

您需要迭代您的ResultSet調用next()。

我已經試過這爲MS SQL Server 2012的

public class RetrieveAllTables { 
    public static void main(String[] args) { 
     try { 
      Connection connection = DriverManager.getConnection("jdbc:sqlserver://localhost:1433;databaseName=HubDB", "sa", "password"); 
      DatabaseMetaData databaseMetaData = connection.getMetaData(); 
      ResultSet resultSet = databaseMetaData.getTables(null, null, "%", new String[] {"TABLE"}); 

      while(resultSet.next()) { 
       System.out.print("Table Catalog: " + resultSet.getString("TABLE_CAT")); 
       System.out.print("\tTable Schema: " + resultSet.getString("TABLE_SCHEM")); 
       System.out.print("\tTable Name: " + resultSet.getString("TABLE_NAME")); 
       System.out.println(); 
      } 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

返回以下的輸出:

Table Catalog: HubDB Table Schema: dbo Table Name: films 
Table Catalog: HubDB Table Schema: dbo Table Name: FILMS_AUDIT 
Table Catalog: HubDB Table Schema: sys Table Name: trace_xe_action_map 
Table Catalog: HubDB Table Schema: sys Table Name: trace_xe_event_map 

因此,你需要改變從

ResultSet resultSet = databaseMetaData.getTables(null, null, "%", new String[] {"TABLE"}); 

以下到

ResultSet resultSet = databaseMetaData.getTables(null, "dbo", "%", new String[] {"TABLE"}); 

您可以參閱getTables()方法的文檔here

利用這些信息,您可以動態傳遞個人TableName檢索Primary KeyForeign Key細節。您現有的代碼只需傳遞一個參數就可以很好地檢索這些細節,即上述代碼中的TableName

+0

'getTables'的'types'參數使用'null'可能不是這裏想要的(因爲它包括視圖,系統表等)。 –

+0

@MarkRotteveel,謝謝你指出。明白你說了什麼,因此試着用我的代碼來確定模式名稱在本例中與類型'new String [] {「TABLE」}一起也很重要。用修改後的代碼更新我的答案。 –

+0

我現在對API有更好的理解!感謝您的提示@MarkRotteveel! –

相關問題