Apache Derby дает странные имена индексам, которые я создал, со значимыми именами - PullRequest
0 голосов
/ 24 декабря 2018

Я создаю простую демонстрационную таблицу в дерби, используя этот 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 возможных способа достижения этого:

  1. JDBC ->

    Используя DatabaseMetaData, я могу сделать что-то вроде

    metadata.getIndexInfo(null, "APP", "MY_TABLE", false, false)
    

    Итерируйте по набору результатов, пока я не получу строку, где

    "MY_TABLE_IX1".equals(resultSet.getString("INDEX_NAME"))
    
  2. 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### действительно являются первичными ключами и индексами, установленными в столбцах первичных ключей (хотя это в основном неоправданно, но это не так).

Тем не менее моя проблема заключается в том, что мне нужно выяснить,если этот индекс я объявил с определенным именем - и это имя нигде не найти.

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Тем не менее, моя проблема в том, что мне нужно выяснить, был ли этот индекс, который я объявил с определенным именем, - и это имя нигде не найдено.

Я только что проверил, используя DBeaver иderby-10.14.2.0.jar, и я обнаружил, что, как упоминает @Noam, «MY_TABLE_PK» указан в SYS.SYSCONSTRAINTS

SELECT * FROM SYS.SYSCONSTRAINTS WHERE CONSTRAINTNAME='MY_TABLE_PK'

, а «MY_TABLE_IX1» указан в SYS.SYSCONGLOMERATES

SELECT * FROM SYS.SYSCONGLOMERATES WHERE CONGLOMERATENAME='MY_TABLE_IX1'
0 голосов
/ 24 декабря 2018

SQL* - это уникальные / первичные индексы, которые настраиваются непосредственно в определении таблицы, например MY_TABLE_PK

В соответствии с их документацией (https://db.apache.org/derby/docs/10.1/ref/rrefsqlj13590.html) вы сможете найтииндексы ограничений вы можете использовать этот запрос (я внес небольшие изменения в запрос там):

SELECT * FROM  SYS.SYSCONSTRAINTS t
JOIN SYS.SYSCONGLOMERATES c ON t.TABLEID = c.TABLEID 
WHERE CONSTRAINTNAME = 'MY_TABLE_PK';
...