前言
想的再多,不如行动起来,大家好,我是啊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索引名称 |
---|---|
mysql | INDEX_NAME = PRIMARY |
Oracle | INDEX_NAME = sys_* 或 PK_* |
PostgreSQL | INDEX_NAME = ${tableName}_pkey |
SQL Server | INDEX_NAME = PK_${tableName} |