指向相同数据库的DatabaseMetaData的相同方法有不同的响应吗?

时间:2019-06-18 14:23:59

标签: java mysql sql-server jdbc

当我调用方法getIndexInfo( catalog, schema, table, true, false )时,我收到的ResultSet与所描述的略有不同:

  1. 在MySQL(5.7)中,我收到一个包含以下内容的ResultSet:

    • 与主键列说明相对应的一行
    • 与唯一列描述相对应的
    • n
  2. 使用SQL Server(14.00),我收到一个包含以下内容的结果集:

    • 与主键的tableIndexStatistic相对应的一行
    • 与主键列说明相对应的一行
    • 与唯一列描述相对应的
    • n
    • 与索引列说明相对应的
    • m

由于项目选择,所有主键都是自动递增的,因此,在任何情况下主键列都不是唯一列。

我正在寻找编写与数据库无关的解决方案,因为它将用于MySQL和SQL Server数据库;

MySQL使用MySQL-AB JDBC驱动程序5.1.20,SQL Server使用Microsoft JDBC驱动程序6.4。

最初,我“解决”了从会话中检索驱动程序名称的问题,以便为每个数据库应用特定的过滤器; 对于MySQL,我发现主键的列INDEX_NAME总是'PRIMARY',而对于SQL Server,我发现列TYPE是:

  • tableIndexStatistic为0
  • 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

因此,我正在考虑继续扩展包括NON_UNIQUE列的SQL Server筛选器,但是,与documentation中所述相反,当我检索tableIndexStatistic时,我将得到null代替的false

由于我的主要目标是从这两个数据库中检索相同的唯一键结果,因此我对应该如何处理所有与文档不一致的地方感到有些困惑。

0 个答案:

没有答案