当我调用方法getIndexInfo( catalog, schema, table, true, false )
时,我收到的ResultSet与所描述的略有不同:
在MySQL(5.7)中,我收到一个包含以下内容的ResultSet:
使用SQL Server(14.00),我收到一个包含以下内容的结果集:
由于项目选择,所有主键都是自动递增的,因此,在任何情况下主键列都不是唯一列。
我正在寻找编写与数据库无关的解决方案,因为它将用于MySQL和SQL Server数据库;
MySQL使用MySQL-AB JDBC驱动程序5.1.20,SQL Server使用Microsoft JDBC驱动程序6.4。
最初,我“解决”了从会话中检索驱动程序名称的问题,以便为每个数据库应用特定的过滤器;
对于MySQL,我发现主键的列INDEX_NAME
总是'PRIMARY'
,而对于SQL Server,我发现列TYPE
是:
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 。
因此,我正在考虑继续扩展包括NON_UNIQUE
列的SQL Server筛选器,但是,与documentation中所述相反,当我检索tableIndexStatistic时,我将得到null
代替的false
。
由于我的主要目标是从这两个数据库中检索相同的唯一键结果,因此我对应该如何处理所有与文档不一致的地方感到有些困惑。