Когда я вызываю метод getIndexInfo( catalog, schema, table, true, false )
, я получаю ResultSet, немного отличающийся от того, что описано:
С MySQL (5.7) я получаюResultSet, содержащий:
- одна строка, соответствующая описанию столбца первичного ключа
- n строки, соответствующие описанию уникальных столбцов
С 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
.
Я немного запуталсяо том, как мне следует подойти ко всем этим несоответствиям с документацией, поскольку моя главная цель - получить один и тот же результат уникальных ключей из этих двух баз данных.