2014-01-08 31 views
2

我想編寫一個SpringBatch Tasklet,它自動激活或取消激活給定數據庫表的所有索引。代碼需要獨立於DBMS工作(需要SQL Server,Oracle和HSQLDB)。使用JDBC檢索給定表的所有索引

這是我到目前爲止已經試過:

DatabaseMetaData dbMetaData = connection.getMetaData(); 
ResultSet rs = dbMetaData.getIndexInfo(null, null, tableName, true, false); 
while (rs.next()) { 
    // work with ResultSet 
} 

但是,我沒有得到Indexes或任何有用的信息的名稱。

那麼,任何人都可以提供一些關於如何使用JDBC連接對象將表的所有索引設置爲活動或非活動狀態的提示?

+0

的tablename是區分大小寫;檢查它是否完全匹配,也可以用true指定參數'unique',這意味着它只會**包含唯一索引。你的表格是否有唯一的索引? –

+0

關於其他問題禁用索引對於每個RDBMS都不是那麼容易和真正不同的(在MSSQL中使用DBCC命令或閱讀http://stackoverflow.com/questions/6146024/is-it-possible-to-temporarily-disable-an-index -in-postgres)
你確定你不能重新考慮你的設計嗎?你需要哪一個? –

回答

4

您必須對主鍵(使用DatabaseMetaData.getPrimaryKeys()進行檢索)和其他索引(通過dbMetaData.getIndexInfo(null, null, tableName, true, false))進行區分。
在你的循環使用:

  • rs.getString("INDEX_NAME")提取索引名
  • rs.getBoolean("NON_UNIQUE")提取獨特信息
  • rs.getShort("TYPE")提取指數型
  • rs.getInt("ORDINAL_POSITION")提取順序位置

使用ORDINAL_POSITION作爲關鍵中斷(當前值爲< = o f前一個)來檢測索引變化。
閱讀official DatabaseMetaData.getIndexInfo() doc

+0

你是指「在主鍵之間做出區別」是什麼意思?我嘗試了'DatabaseMetaData dbMetaData = conn.getMetaData(); ResultSet rs = dbMetaData.getIndexInfo(null,null,tableName,true,false); while(rs.next()){String indexName = rs.getString(「INDEX_NAME」) ;}'但我無法檢索索引名稱。 – Nav

0

讓所有指標的另一種方法是使用information_schema statistics表:

public void GetIndexesOfThisTable(final String tableName) { 
    try { 
     PreparedStatement ps = conn.prepareStatement("SELECT DISTINCT INDEX_NAME FROM information_schema.statistics WHERE table_name = ?"); 
     ps.setString(1, tableName); 
     ResultSet rs = ps.executeQuery(); 

     while(rs.next()){ 
      System.out.println(rs.getString(1)); 
     } 
     rs.close(); 
     ps.close();//important to close to prevent resource leaks 
    } 
    catch (Exception ex) {System.out.println(ex.getMessage());}   
} 
+3

你的鏈接是針對MySQL的,而且問題「需要獨立於DBMS工作」。這是否適用於其他數據庫系統? –

相關問題