从java获取数据库中声明的所有索引
是否有任何标准JavaAPI返回数据库中声明的索引。我尝试在数据库元数据中使用getIndexInfo(),但这似乎需要一个表名作为输入,不符合我的要求。从java获取数据库中声明的所有索引,java,database,jdbc,Java,Database,Jdbc,是否有任何标准JavaAPI返回数据库中声明的索引。我尝试在数据库元数据中使用getIndexInfo(),但这似乎需要一个表名作为输入,不符合我的要求。 Thx.索引在表中声明。因此,您应该首先使用DatabaseMetaData.getTables()检索所有表,然后循环表名以获取所有索引。否,您需要触发一些sql,这些sql会根据您使用的DBMS而有所不同 例如,DB2将是:- select * from sysibm.sysindexes where tbcreator = 'IMPAC
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应用程序的执行方式产生一些影响,那么就有严重的错误。我们在应用程序中克隆表,作为克隆的一部分,我们也在克隆约束和索引,因此我必须生成唯一的索引名。由于某些数据库中名称长度的限制,哈希等无法工作。