JDBC索引查询规范

91 阅读3分钟

前言

想的再多,不如行动起来,大家好,我是啊Q,让我们徜徉在知识的海洋里吧。

一起“开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第12天, 点击查看活动详情

上一篇章我们分析了索引不同数据库索引创建的sql脚本异同和不同厂商之间索引的差别。

今天我们来看一下索引查询的相关问题。

查询索引

下面给出了 JDBC规范中索引查询返回的数据的标准规范,我们来看一下这个接口规范的相关内容:

检索给定表的索引和统计信息的说明。它们按NON_UNIQUE、类型、INDEX_NAME和ORDINAL_POSITION排序。

每个索引列说明都有以下列(返回值):

TABLE_CAT 字符串 => 表目录(可能是 null)

TABLE_SCHEM 字符串 => 表架构(可以是 null)

TABLE_NAME 字符串 => 表名

NON_UNIQUE 布尔 => 值 索引值是否可以为非唯一。 当 TYPE 为 tableIndexStatistical 时为 false。

INDEX_QUALIFIER 字符串 => 索引目录(可以是 null); null 当 TYPE 为 tableIndexStatistic 时

INDEX_NAME 字符串 => 索引名称; null 当 TYPE 为 tableIndexStatistical 时

TYPE=>索引类型:

tableIndexStatistic - 用于标识与表的索引描述结合返回的表统计信息

tableIndexClustered - 这是一个聚集索引

tableIndexHashed - 这是一个散列索引

tableIndexOther - 这是其他样式的索引

ORDINAL_POSITION short => 列序列号ORDINAL_POSITION;当 TYPE 为 tableIndexStatistical 时为零

COLUMN_NAME String => 列名; null 当 TYPE 为 tableIndexStatistical 时

ASC_OR_DESC String=>列排序顺序,“A”升序,“D” => =>降序,如果null不支持null排序顺序;当 TYPE 为 tableIndexStatistic 时

CARDINALITY long => 当 TYPE 为 tableIndexStatistical 时,这是表中的行数;否则,它是索引中唯一值的位数。

PAGES long => 当 TYPE 为 tableIndexStatisic 时,这是用于表的页数,否则是用于当前索引的页数。

FILTER_CONDITION String => 筛选条件(如果有)。(可能是 null)

参数:

catalog – 目录名称;必须与存储在此数据库中的目录名称匹配;“” 检索没有目录的那些; null 表示不应使用目录名称来缩小搜索范围

schema – 架构名称;必须与存储在此数据库中的架构名称匹配;“” 检索没有架构的那些; null 表示不应使用架构名称来缩小搜索范围

table ― 表名称;必须与存储在此数据库中的表名匹配

unique – 如果为 true,则仅返回唯一值的索引;如果为 false,则返回索引,而不管是否唯一

approximate – 如果为 true,则允许结果反映近似值或数据外值;如果为 false,则要求结果准确

mysql

上述截图有两个注意点:

1.index_name8 是一个fullText索引,这里索引无法从其他信息得知其具体信息。只有通过ASC_OR_DESC

判断其不是一个普通索引或者联合索引。

2.唯一主键也被返回,其特殊在:INDEX_NAME=PRIMARY

Oracle

select * from all_indexes WHERE table_owner='ARC';

通过该语句查询得出:oracle主键名称有两种命名方式:sys_ 开头或 PK_ 开头。

PostgreSQL

PostgreSQL 的主键索引命名规则:${tableName}_pkey。
SQL Server

上述截图有两个注意点:

1.index_name8 是一个fullText索引,这里索引无法从其他信息得知其具体信息。只有通过ASC_OR_DESC

判断其不是一个普通索引或者联合索引。

2.唯一主键也被返回,其特殊在:INDEX_NAME = PK_${tableName}

总结

各个数据库厂商对主键的处理都不一样,而jdbc查询索引时返回了主键的相关信息。我们在处理时需要筛选排出主键。

以下是pk名称总结:

数据库pk索引名称
mysqlINDEX_NAME = PRIMARY
OracleINDEX_NAME = sys_* 或 PK_*
PostgreSQLINDEX_NAME = ${tableName}_pkey
SQL ServerINDEX_NAME = PK_${tableName}