Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从java获取数据库中声明的所有索引_Java_Database_Jdbc - Fatal编程技术网

从java获取数据库中声明的所有索引

从java获取数据库中声明的所有索引,java,database,jdbc,Java,Database,Jdbc,是否有任何标准JavaAPI返回数据库中声明的索引。我尝试在数据库元数据中使用getIndexInfo(),但这似乎需要一个表名作为输入,不符合我的要求。 Thx.索引在表中声明。因此,您应该首先使用DatabaseMetaData.getTables()检索所有表,然后循环表名以获取所有索引。否,您需要触发一些sql,这些sql会根据您使用的DBMS而有所不同 例如,DB2将是:- select * from sysibm.sysindexes where tbcreator = 'IMPAC

是否有任何标准JavaAPI返回数据库中声明的索引。我尝试在数据库元数据中使用getIndexInfo(),但这似乎需要一个表名作为输入,不符合我的要求。
Thx.

索引在表中声明。因此,您应该首先使用DatabaseMetaData.getTables()检索所有表,然后循环表名以获取所有索引。

否,您需要触发一些sql,这些sql会根据您使用的DBMS而有所不同

例如,DB2将是:-

select * from sysibm.sysindexes where tbcreator = 'IMPACT';
Select * from sqlite_master where type = 'index';
对于sqlite,它将是:-

select * from sysibm.sysindexes where tbcreator = 'IMPACT';
Select * from sqlite_master where type = 'index';
没有一种100%可移植的“查询”方法可以做到这一点,但是许多数据库确实实现了标准的信息模式,因此您可以像这样进行查询

    sql = "select TABLE_NAME, INDEX_NAME, NON_UNIQUE, COLUMN_NAME " +
            "from INFORMATION_SCHEMA.STATISTICS " +
            "where TABLE_SCHEMA = ? " +
            "order by TABLE_NAME, INDEX_NAME, SEQ_IN_INDEX";
MySQL和SQLServer支持这一点。甲骨文没有


编辑:我最初说的是“没有100%可移植的方式”,但是您可以使用JDBC元数据API来实现这一点,但是正如前面的回答中所指出的,根据表的数量,这可能是低效的。

理解逻辑概念,但这似乎是一种低效的方式。因为我的数据库点击率太高了。你们有多少张表?通常这不是性能问题。这非常便宜。仅打开连接是最昂贵的步骤。您可以在同一个事务中完成这一切。一个好的选择是使用连接池。我希望有std api来实现这一点。看起来我必须启动一个sql来完成它:)为什么?如果知道索引会对Java应用程序的执行方式产生一些影响,那么就有严重的错误。我们在应用程序中克隆表,作为克隆的一部分,我们也在克隆约束和索引,因此我必须生成唯一的索引名。由于某些数据库中名称长度的限制,哈希等无法工作。