MySQL中如何列出指定索引的所有条目?及INDEX COLUMNS LIST含义
如何列出指定唯一索引的所有条目 & 理解"INDEX COLUMNS LIST"
先澄清唯一索引的唯一性逻辑
你之前以为是拼接列值来校验唯一性,这是错误的。唯一索引的唯一性是基于列值组成的元组整体,举个例子:
- 行1:col_1='a',col_2='bc'
- 行2:col_1='ab',col_2='c'
这两行的列值拼接后都是'abc',但作为元组('a','bc')和('ab','c')是完全不同的,唯一索引会判定它们是合法的不同条目,不会触发唯一约束冲突。
列出指定索引的所有条目
不同数据库的实现方式不一样,这里给几个主流数据库的操作方法:
MySQL/MariaDB
直接查询索引对应的列即可,因为唯一索引的条目就是这些列的唯一组合:
SELECT col_1, col_2 FROM table_test GROUP BY col_1, col_2;
如果要确认索引是否被用到,可以加EXPLAIN查看执行计划:
EXPLAIN SELECT col_1, col_2 FROM table_test GROUP BY col_1, col_2;
PostgreSQL
直接查询索引列的唯一组合,或者先查系统视图确认索引包含的列再查询:
SELECT col_1, col_2 FROM table_test GROUP BY col_1, col_2;
查询索引对应的列清单:
SELECT attname FROM pg_index i JOIN pg_attribute a ON a.attrelid = i.indrelid AND a.attnum = ANY(i.indkey) WHERE i.indrelid = 'table_test'::regclass AND i.indexrelid = 'index_idx'::regclass;
SQL Server
查询索引列的唯一组合:
SELECT col_1, col_2 FROM table_test GROUP BY col_1, col_2;
查询索引对应的列清单:
SELECT name AS column_name FROM sys.index_columns ic JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id WHERE ic.object_id = OBJECT_ID('table_test') AND ic.index_id = (SELECT index_id FROM sys.indexes WHERE object_id = OBJECT_ID('table_test') AND name = 'index_idx');
关于"INDEX COLUMNS LIST"的解释
这个词就是指某个索引所关联的所有列的清单,比如你的index_idx对应的就是col_1和col_2。数据库的系统元数据中会存储每个索引对应的列信息,查询这些系统视图/表就能得到这个清单——它的作用是让你明确这个索引是基于哪些列构建的,避免搞错索引对应的字段。
内容的提问来源于stack exchange,提问作者Aloof aloof
相关产品推荐
相关产品推荐

