JDBC: невозможно получить составной индекс для моей таблицы - PullRequest
1 голос
/ 21 ноября 2019

Я пытаюсь перечислить все индексы для всех таблиц в моей БД (используя универсальное решение, не относящееся к СУБД)

Чтобы проверить мое решение, у меня есть две таблицы в MSБД SQL Server tempdb

  • Хранилища
  • Staffs

Каждая таблица имеет PK, а таблица staffs также имеет столбец уникального ключа, который называетсяemail. В таблице stores есть составной индекс store_id, store_name.

Ниже приведены индексы (снимки экрана из DBeaver)

enter image description here

enter image description here

enter image description here

enter image description here

Фрагмент кодавыглядит следующим образом

.
.
.
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("=====================================================");

}

Вывод выглядит следующим образом (составной / составной индекс не возвращается)

**********************************************************
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
=====================================================

Я прочитал следующую ссылку документации [JDBCdoc]

Кроме того, прочитайте эти вопросы о стеке потока на ту же тему

[Вопрос 1] [Вопрос 2] [Вопрос 3]

Что я должен сделать, чтобы сделать это через JDBC? Один из вариантов, который у меня есть, - это иметь специфичные для БД запросы, чтобы получить список индексов и запустить их через JDBC (но я не хочу идти по этому пути)

1 Ответ

2 голосов
/ 21 ноября 2019

Четвертый параметр для getIndexInfo():

unique - при true возвращать только индексы для уникальных значений;при значении false возвращать индексы независимо от того, уникальны они или нет

Когда вы передаете true для этого параметра, возвращаются только уникальные индексы, но myCompound1 не определяется как уникальный, поэтому getIndexInfo () не возвращает его. Вам нужно поставить false для этого параметра:

tableMeta.getIndexInfo(null, null, table, <b>false</b>, false);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...