Разный ответ для одного и того же метода DatabaseMetaData указывает на разные базы данных? - PullRequest
0 голосов
/ 18 июня 2019

Когда я вызываю метод getIndexInfo( catalog, schema, table, true, false ), я получаю ResultSet, немного отличающийся от того, что описано:

  1. С MySQL (5.7) я получаюResultSet, содержащий:

    • одна строка, соответствующая описанию столбца первичного ключа
    • n строки, соответствующие описанию уникальных столбцов
  2. С SQL Server (14.00) я получаю ResultSet, содержащий:

    • одну строку, соответствующую tableIndexStatistic первичного ключа
    • одну строку, соответствующую первичномуописание ключевого столбца
    • n строк, соответствующих уникальному описанию столбцов
    • m строк, соответствующих описанию столбцов индекса

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

Я ищунаписать решение, независимое от базы данных, так какон будет использоваться как для баз данных MySQL, так и для SQL Server;

MySQL использует драйвер JDBC MySQL-AB 5.1.20, SQL Server использует драйвер Microsoft JDBC 6.4.

Первоначально я "решил"эта проблема извлечения из сеанса имени драйвера, чтобы применить определенный фильтр для каждой базы данных;для MySQL я обнаружил, что столбец INDEX_NAME для первичного ключа всегда равен 'PRIMARY', в то время как для SQL Server я обнаружил, что столбец TYPE:

  • 0 для tableIndexStatistic
  • 1 для наших первичных ключей SQL Server (tableIndexClustered)
  • 2 (пока не найдено в моем случае, но для tableIndexHashed)
  • 3 для уникальных ключей (tableIndexOther)

Разница между MySQL и SQL Server заключается в том, что первичные ключи имеют соответственно TYPE 3 и 1 .

Пример фильтра:

String driver = session.getConfiguration().getDatabaseId();
DatabaseMetaData metadata = session.getConnection().getMetaData();

ResultSet result = metadata.getIndexInfo(catalog, schema, table, true, false);

while( result.next() ){
    if( "mysql".equals(driver) ){
        if( !"PRIMARY".equals((String) result.getObject("INDEX_NAME"))){
            ... code to save the result ...
        }
    } else if ( "sqlserver".equals(driver) ){
        if( 3 == (short) result.getObject("TYPE")){
            ... code to save the result ...       
        } 
    } else {
        throw new Exception();
    }
}

Этот код работал немного, пока я не обнаружил на SQL Server таблицу с индексом;в этом случае, согласно документации, связанной ранее, индексы являются частью tableIndexOther, поэтому они имеют столбец TYPE со значением 3 .

. На данный момент я заметил, чтостолбец NON_UNIQUE равен true для описаний уникальных столбцов и false для описаний столбцов индекса.

Поэтому я подумывал продолжить расширение фильтра SQL Server, включаястолбец NON_UNIQUE, но, как описано в документации , когда я получу tableIndexStatistic, я получу null вместо false.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...