簡體   English   中英

JDBC:無法為我的表獲取復合索引

[英]JDBC: Unable to get composite index for my table

我正在嘗試列出我的數據庫中所有表的所有索引(使用不特定於 RDBMS 的通用解決方案)

為了測試我的解決方案,我在 MS SQL 服務器數據庫tempdb中有 2 個表

  • 專賣店
  • 員工

每個表都有一個 PK, email staffs唯一鍵列。 store_id, store_name上的stores表上有一個復合索引。

以下是索引(來自 DBeaver 的屏幕截圖)

在此處輸入圖像描述

在此處輸入圖像描述

在此處輸入圖像描述

在此處輸入圖像描述

代碼片段如下

.
.
.
System.out.println("**********************************************************");
System.out.println("schema >>> "+schema);
System.out.println("table >>> "+table);
ResultSet indexValues = tableMeta.getIndexInfo(null, null, table, true, false);
while (indexValues.next()) {
    ResultSetMetaData rsmd = indexValues.getMetaData();  
    String idxName = indexValues.getString("INDEX_NAME");
    System.out.println("=====================================================");
    System.out.println("rs1 >>> "+indexValues.getString(1));
    System.out.println("rs2 >>> "+indexValues.getString(2));
    System.out.println("rs3 >>> "+indexValues.getString(3));
    System.out.println("rs4 >>> "+indexValues.getString(4));
    System.out.println("rs5 >>> "+indexValues.getString(5));
    System.out.println("rs6 >>> "+indexValues.getString(6));
    System.out.println("rsmd >>> "+rsmd.getColumnCount());
    System.out.println("INDEX_NAME >>> "+indexValues.getString("INDEX_NAME"));
    System.out.println("INDEX_QUALIFIER >>> "+indexValues.getString("INDEX_QUALIFIER"));
    System.out.println("NON_UNIQUE >>> "+indexValues.getBoolean("NON_UNIQUE"));
    System.out.println("TYPE >>> "+indexValues.getShort("TYPE"));
    System.out.println("ORDINAL_POSITION >>> "+indexValues.getString("ORDINAL_POSITION"));
    System.out.println("COLUMN_NAME >>> "+indexValues.getString("COLUMN_NAME"));
    System.out.println("ASC_OR_DESC >>> "+indexValues.getString("ASC_OR_DESC"));
    System.out.println("FILTER_CONDITION >>> "+indexValues.getString("FILTER_CONDITION"));
    System.out.println("TABLE_SCHEM >>> "+indexValues.getString("TABLE_SCHEM"));
    System.out.println("TABLE_CAT >>> "+indexValues.getString("TABLE_CAT"));
    System.out.println("=====================================================");

}

output如下(不返回復合/復合索引)

**********************************************************
schema >>> dbo
table >>> stores
=====================================================
rs1 >>> tempdb
rs2 >>> dbo
rs3 >>> stores
rs4 >>> null
rs5 >>> null
rs6 >>> null
rsmd >>> 13
INDEX_NAME >>> null
INDEX_QUALIFIER >>> null
NON_UNIQUE >>> false
TYPE >>> 0
ORDINAL_POSITION >>> null
COLUMN_NAME >>> null
ASC_OR_DESC >>> null
FILTER_CONDITION >>> null
TABLE_SCHEM >>> dbo
TABLE_CAT >>> tempdb
=====================================================
=====================================================
rs1 >>> tempdb
rs2 >>> dbo
rs3 >>> stores
rs4 >>> 0
rs5 >>> stores
rs6 >>> PK__stores__A2F2A30C0F20F60B
rsmd >>> 13
INDEX_NAME >>> PK__stores__A2F2A30C0F20F60B
INDEX_QUALIFIER >>> stores
NON_UNIQUE >>> false
TYPE >>> 1
ORDINAL_POSITION >>> 1
COLUMN_NAME >>> store_id
ASC_OR_DESC >>> A
FILTER_CONDITION >>> null
TABLE_SCHEM >>> dbo
TABLE_CAT >>> tempdb
=====================================================
**********************************************************
schema >>> dbo
table >>> staffs
=====================================================
rs1 >>> tempdb
rs2 >>> dbo
rs3 >>> staffs
rs4 >>> null
rs5 >>> null
rs6 >>> null
rsmd >>> 13
INDEX_NAME >>> null
INDEX_QUALIFIER >>> null
NON_UNIQUE >>> false
TYPE >>> 0
ORDINAL_POSITION >>> null
COLUMN_NAME >>> null
ASC_OR_DESC >>> null
FILTER_CONDITION >>> null
TABLE_SCHEM >>> dbo
TABLE_CAT >>> tempdb
=====================================================
=====================================================
rs1 >>> tempdb
rs2 >>> dbo
rs3 >>> staffs
rs4 >>> 0
rs5 >>> staffs
rs6 >>> PK__staffs__1963DD9CCB589A48
rsmd >>> 13
INDEX_NAME >>> PK__staffs__1963DD9CCB589A48
INDEX_QUALIFIER >>> staffs
NON_UNIQUE >>> false
TYPE >>> 1
ORDINAL_POSITION >>> 1
COLUMN_NAME >>> staff_id
ASC_OR_DESC >>> A
FILTER_CONDITION >>> null
TABLE_SCHEM >>> dbo
TABLE_CAT >>> tempdb
=====================================================
=====================================================
rs1 >>> tempdb
rs2 >>> dbo
rs3 >>> staffs
rs4 >>> 0
rs5 >>> staffs
rs6 >>> UQ__staffs__AB6E6164E6F8EDB6
rsmd >>> 13
INDEX_NAME >>> UQ__staffs__AB6E6164E6F8EDB6
INDEX_QUALIFIER >>> staffs
NON_UNIQUE >>> false
TYPE >>> 3
ORDINAL_POSITION >>> 1
COLUMN_NAME >>> email
ASC_OR_DESC >>> A
FILTER_CONDITION >>> null
TABLE_SCHEM >>> dbo
TABLE_CAT >>> tempdb
=====================================================

我已閱讀以下文檔鏈接[JDBC doc]

此外,請閱讀有關同一主題的這些 stackoverflow 問題

[問題 1] [問題 2] [問題 3]

我應該怎么做才能通過 JDBC 完成這項工作? 我有一個選擇是讓數據庫特定查詢來獲取索引列表並通過 JDBC 運行它們(但我不想 go 這條路線)

getIndexInfo()的第四個參數是

unique - 如果為 true,則僅返回唯一值的索引; 當為 false 時,無論是否唯一,都返回索引

當您為該參數傳遞true時,僅返回唯一索引,但myCompound1未定義為唯一,因此 getIndexInfo() 不返回它。 您需要為該參數設置false

tableMeta.getIndexInfo(null, null, table, false, false);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM