2017-10-09 105 views
1

我試圖找出某列是否索引(本身)。換句話說,我不想拉多列的指數。查找單列索引

有人可以幫助我重寫這隻拉單列索引?

select table_name, index_name 
from information_schema.statistics 
where table_schema='schema' and table_name='table' and column_name='column'; 

回答

0

您可以在子查詢中按照名稱對索引進行分組,然後選擇唯一的索引。

select index_name from 
    (select index_name, COUNT(*) as col_count 
    from information_schema.statistics 
    where table_schema='schema' and table_name='table' 
    group by index_name) as sub 
where col_count = 1 

您可能要添加到column_name內外select -list;和外部where條件。這可能會在這種情況下工作,因爲條件col_count = 1,但一般有一個簡單的列(不使用COUNTMAX,...)在select -list未在group語句來上市,導致不可預測的行爲,參見sql antipattern

+0

這不起作用。這仍列出所有具有該列名稱的索引,而不管它是否爲單列多列索引。 – user3299633

+0

是的,抱歉,當我將測試環境中的查詢複製到SO時,我犯了一個錯誤。你應該在內部查詢中刪除'和column_name ='column''。我已經更新了答案。如果您已經指定了'column_name',那麼沒有其他列留給'COUNT'。 – sauerburger

+0

您是否仍然遇到此解決方案的問題? – sauerburger

0

無子選擇改寫...

這將爲特定的指數收益表和索引的名字它是一個單一的(不明)列

SELECT table_name, index_name 
FROM information_schema.statistics 
WHERE table_schema='schema' 
AND table_name='table' 
AND index_name = 'index' 
GROUP BY table_name, index_name 
HAVING COUNT(*) = 1; 

這是相同的在給定表中的所有單列索引

SELECT table_name, index_name 
FROM information_schema.statistics 
WHERE table_schema='schema' 
AND table_name='table' 
GROUP BY table_name, index_name 
HAVING COUNT(*) = 1; 

最後,所有單列索引在給定的數據庫

SELECT table_name, index_name 
FROM information_schema.statistics 
WHERE table_schema='schema' 
GROUP BY table_name, index_name 
HAVING COUNT(*) = 1;