Я создаю простую демонстрационную таблицу в дерби, используя этот ddl:
CREATE TABLE MY_TABLE (
SESSION_ID CHAR(36),
ATTRIBUTE_NAME VARCHAR(200),
CONSTRAINT MY_TABLE_PK PRIMARY KEY (SESSION_ID, ATTRIBUTE_NAME),
);
CREATE INDEX MY_TABLE_IX1 ON MY_TABLE (SESSION_ID);
Я хочу проверить в тесте, действительно ли INDEX MY_TABLE_IX1
был создан.
ПоискВ сети я вижу 2 возможных способа достижения этого:
JDBC ->
Используя DatabaseMetaData
, я могу сделать что-то вроде
metadata.getIndexInfo(null, "APP", "MY_TABLE", false, false)
Итерируйте по набору результатов, пока я не получу строку, где
"MY_TABLE_IX1".equals(resultSet.getString("INDEX_NAME"))
SQL ->
SELECT c.CONGLOMERATENAME, t.TABLENAME FROM SYS.SYSCONGLOMERATES c
JOIN SYS.SYSTABLES t ON c.TABLEID = t.TABLEID
WHERE c.CONGLOMERATENAME = 'MY_TABLE_IX1' AND t.TABLENAME = 'MY_TABLE'
Оставляя в сторонеочевидно (например, я должен также фильтровать по имени столбца, и тому подобное), я сталкиваюсь с очень странным поведением:
Дерби сохраняет некоторые моих индексов как строки вида SQL181215003216931
, заставляя меняневозможно найти эти индексы по имени, в то время как другие индексы сохраняются под именем, которое я указал в моем ddl.
Хотя я привел небольшой пример, моя фактическая схема довольно велика, и если я запускаю следующее:
SELECT c.CONGLOMERATENAME, t.TABLENAME FROM SYS.SYSCONGLOMERATES c
JOIN SYS.SYSTABLES t ON c.TABLEID = t.TABLEID
WHERE c.CONGLOMERATENAME LIKE '%SQL%'
Я получаю довольно большой результат по индексам, которые названы одинаково (они отличаются наон тянется за числами после части SQL
), хотя я дал каждому из них осмысленное имя.
Я пытался отыскать в Интернете информацию об этом поведении, но оказался пустым - кто-нибудь знает ответ намоя тайна?
Кажется, что нет никаких ссылок из имен типов SQL####
на имена, которые я первоначально дал, так как я могу найти свои индексы на основе моих имен?
Вотпример вывода из второго SQL-запроса:
CONGLOMERATENAME TABLENAME
------------------------------------
SQL181215003159230 MY_TABLE
SQL181215003159240 SOME_OTHER_TABLE
SQL181215003216890 YET_ANOTHER_TABLE
и из выполнения JDBC:
TABLE_CAT|TABLE_SCHEMA|TABLE_NAME |NON_UNIQUE|INDEX_QUALIFIER|INDEX_NAME |TYPE|ORDINAL_POSITION|COLUMN_NAME|ASC_OR_DESC|CARDINALITY|PAGES|FILTER_CONDITION|
|APP |MY_TABLE |false | |SQL181224003626061|3 |1 |SESSION_ID |A |null |null |null |
|APP |SOME_OTHER_TABLE |false | |SQL181215003159240|3 |1 |SESSION_ID |A |null |null |null |
--- Редактировать ----: Основываясь на ответе @ Noam ниже, кажетсяон прав, и что индексы SQL###
действительно являются первичными ключами и индексами, установленными в столбцах первичных ключей (хотя это в основном неоправданно, но это не так).
Тем не менее моя проблема заключается в том, что мне нужно выяснить,если этот индекс я объявил с определенным именем - и это имя нигде не найти.